性格悪い人が優勝

お世話になっております。

サーバーから、数10KBレベルのデータを、500台程度のクライアントにソケット通信で
配信したいと思った場合に、できる限り早く配信するには、どういったところを強化するのが
効果的なのでしょうか?
(CPU、メモリ、NIC、回線の種類、果てはサーバーの台数、回線の本数など)

また、例えば、
HPのDL360 G7の最小構成ぐらいで回線1本では、上記データはどのくらいの時間で
配信できるものなのでしょうか?

「500台程度なら1秒もかからない」や「1台目と500台目で10分ぐらい差がでるのでは。」などの
ご回答が頂けるとありがたいです。
(計算方法なども教えて頂けると助かります。)

よろしくお願いします。

A 回答 (2件)

「サーバーから、数10KBレベルのデータを、500台程度のクライアントにソケット通信で配信」


「LANの外です。全国の拠点(クライアントPC)にインターネット経由で配信する予定です。」
「拠点側にはまだ何も無いので、回線やルーターなども要件に合わせて選べます。」
「XML形式で、500台全てに同じデータを送ります。但し、送信の頻度としては、数秒に一度配信処理を実行します。」

これが条件だとするね。

まず、わかりやすくするために、500箇所の拠点に『異なる』データを送信するならどうするかね。

■ 例その1-A

普通に、
・TCP コネクションを張って
・10KB データ送信して
・コネクションを閉じる
と、一台あたり 2400ms かかったとして、単純に 500 倍だから
1200,000ms → 1200秒 → 20分

単純に、一台一台、シーケンシャルに、処理すると、一回のデータ送信に 『20分』かかるということになる。
とても、「数秒に一度配信処理を実行」は間に合わない。。。

なので、例えばこれを 20拠点パラレルで通信したとすると。。。20で割れば『1分』。
でも「数秒に一度配信処理を実行」まだまだ足りない。

100拠点パラレルで通信できるような、サーバのスペックと、ネットワーク幅を持たせて、ようやく『2秒』

次に、サーバのスペックね。

これを 4スレッド対応の CPU 一つでまかなうためには、
500(拠点) ÷ 4(スレッド) × 2.4(秒/拠点) ÷ 2(秒)→ 150 (プロセス)

つまり、常に 150個のプロセスが動き続けないとダメ。
。。。ちょっと無謀かな?

12スレッド対応 CPU だと、1/3 だから 50プロセス。ちょっといけそうな気がする。

ネットワーク幅は、
10000(バイト) × 8(ビット) × 500(拠点) ÷ 2(秒) ÷ 0.5 (転送効率) = 40,000,000(bps)
= 40(Mbps)

サーバのネットワーク幅は 50Mbps の最低保障があればOKかな?



■ 例その1-B

500拠点の TCP コネクションを持続するなら、。。。
500(拠点) ÷ 4(スレッド) = 125 (プロセス)
毎回コネクションを閉じるよりちょっとだけ、ましかな?

12 スレッド対応 CPU なら 1/3 で ≒ 42 プロセス。


■ 例その1-C

TCP コネクションを非同期、イベント駆動型(node.jsのようなタイプ)で構築。
プロセス数やスレッド数を最低限に抑えられるので、ネットワーク幅さえクリアすればOK!

問題点、
一つのプロセスに、たくさんの拠点が依存してるから、プロセスが一つでもダウンすると、
影響が大きいので、メモリや CPU の信頼性や誤動作の原因のノイズの除去や電源の安定が肝。
それなりに、サーバ周辺にお金がかかるとおもう。


■ 例その2

TCP じゃなくて、UDP で 500拠点にパケットを投げまくる!
これなら、CPU の性能はそれほどいらないから 4スレッド対応の CPU で十分だとおもう。

問題点、
・データが届いたことが保障されない。
・届く順番が保障されない。
・通信経路でのデータ改竄防止の仕組み(SSL とか SSH)が利用できない。
自前で実装するのでちょっと大変かな?

でも、ネットワークプログラマなら腕のみせどころかも。

サーバのネットワーク幅は、
10000(バイト) × 8(ビット) × 500(拠点) ÷ 2(秒) ÷ 0.8 (転送効率) = 25(Mbps)
ネットワークの最低保証は、30Mbps は欲しいかな?



次は、500箇所の拠点に『同じ』データを送信するなら。。。

■ 例その3

TCP コネクション持続型で、ツリー状にバケツリレー。
サーバのネットワーク幅も普通でOK!

1台が8台と通信したとすると、
log(500) / log(8) = 2.98859476 ≒ 3(段構成)
サーバ→ 8台(1次中継) → 64台(2次中継) → 512台(末端)

問題点は、1次中継がダウンすると、末端への影響が大きいこと。
中継のバックアップシステムを適切に設計するのが肝心。


■ 例その4

500拠点とサーバで P2P ネットワークを構築して、データをプッシュしていく。
各拠点自体もサーバになるから、メインサーバのスペックもネットワーク幅も最低で OK。

P2P ネットワークの設計が肝。
P2P ネットワークを適切に設計できるエンジニアが日本にどのぐらいいるかは不明。
数十人?数百人?数千人?

とても、とても、とても、効率的。
    • good
    • 0
この回答へのお礼

お礼が遅くなり申し訳ありません。。

回答、難しく、半分も理解できてませんが、、
必要なスペックなどを洗い出す為の計算式がみえてきました。

一旦プロセスとスレッドでの必要スペックからハードウェアの選定をしてみようと思います。
(「例その1-A」が自分にはわかり易かったです。)

しかし、人気スマホアプリなどでプッシュ配信を行う業者は、いったいどのような方法なんですかね・・・
サーバー何十台、回線最低保証1Gbpsとかなんでしょうか・・・いったい月にいくらかかるのか。

ありがとうございました!!

お礼日時:2012/06/13 23:13

必要そうな情報



サーバはLANの内?外?

送信する数 10KB のデータの内容は、全て異なるか?同じか?

あと、サーバと500台の PC のネットワーク構成(少なくともルータは全部)

を書くと、良さそうな回答がつくかも。

この回答への補足

ありがとうございます。
現状、構成を考えている段階でして、何も存在していない状態です。
決まっている範囲での内容としては、

> サーバはLANの内?外?
LANの外です。全国の拠点(クライアントPC)にインターネット経由で配信する予定です。
拠点側にはまだ何も無いので、回線やルーターなども要件に合わせて選べます。

> 送信する数 10KB のデータの内容は、全て異なるか?同じか?
XML形式で、500台全てに同じデータを送ります。
但し、送信の頻度としては、数秒に一度配信処理を実行します。

> あと、サーバと500台の PC のネットワーク構成(少なくともルータは全部)
まだ構想段階でして、回線やデータセンターすらも決まっていないのでルータもありません。。

配信事業を経験したことがなく、どこら辺に気をつけるかが知りたく、
助言頂けるとありがたいです。(おそらく専門業者にも相談しなければならないと思いますが。)

経験則や、前提が多少ずれていても良いので、回答頂けませんでしょうか。

宜しくお願い致します。

補足日時:2012/06/06 12:07
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!