2

クライアントにデータを「ストリーミング」するための「comet」サーバーを作成する予定です。マルチコア CPU を利用するために過去に 1 つを強化しましたが、今はゼロから始めています。サーバーの電源として epoll/kqueue または libevent を使用する予定です。

私が重視してきた問題の 1 つは、どのサーバー設計を使用するかということです。マルチプロセス モデルを使用してすべての CPU コアを活用することを計画しているため、いくつかのオプションを利用できます。

  1. 事前にフォークされたマルチプロセス - 独自の受け入れを行う各プロセス
  2. マスターを使用した事前フォークされたマルチプロセス - マスター プロセスが受け入れ、記述子の受け渡しを使用して、受け入れたソケットをプロセスに渡します。
  3. 異なるポートを持つ事前フォークされたマルチプロセス - 各プロセスは、同じシステムの異なるポートでリッスンします。ロードバランサーは、個々のデーモン プロセスからの負荷フィードバックに基づいて、次の接続を取得するプロセスを決定します。

設計 #2 は最も複雑です。設計 3 は単純ですが、設計に関係なく追加のハードウェアが必要になります。これは、複数のマシンでこれを実行し、とにかくロードバランサが必要になるためです。設計 1 には雷の群れの問題がありますが、雷の群れは 8 つのプロセスでは大したことではないと思いますが、クライアントが絶えず接続と切断を繰り返している場合 (これはコメット サーバーであるため、これはまれなはずです) は大したことではありません。

私が見たように、#2は複雑で、受け入れごとにマスタープロセスとスレーブプロセスの間で記述子を渡すため、2つの追加のシステムコールが必要です。雷鳴の群れの問題とは対照的に、このオーバーヘッドを持っている方が良いでしょうか? 8 つのプロセスが起動して受け入れを実行している場合、デザイン #1 を使用すると、8 つの受け入れ呼び出しが表示される可能性がありますか?

デザインの選択の長所と短所は何ですか? あなたは何をお勧めします?

4

2 に答える 2

0

非常に大規模で高スループットの HTTP デーモンを作成する場合は、1、2、3 のいずれも適切ではありません。nginx/lighttp のように、スケーラビリティを確保したい場合は、マルチスレッドで 1 対 m または m 対 n モデルを使用することをお勧めします。

実際、プログラムが 1 秒間に 100 未満の接続を処理すると予想される場合、1 番、2 番、3 番では、目に見える違いはないかもしれません。

ただし、1対mまたはm対nの処理モデルに簡単に統合できるため、プロセスをスレッドに切り替えて将来プログラムをスケールアップする場合に備えて、#2を選択します。

于 2011-11-22T00:07:05.143 に答える
0

プロセスではなくスレッドの場合は、オプション 2 を使用します。とにかく、プロセスの場合、これはコストがかかるように見えるので、1 と 3 のいずれかを選択します。

予想される負荷を何らかの方法で推定できる場合は、1 を優先します。眠っている群れのサイズに上限を設定できますか? 新しい接続を受け入れるには、どれくらいの速度が必要ですか?

したがって、トム・ダンソンの方法で大群を高速でレッド川を越えてカンザスまで運ぶ場合は、おそらく 3 番目の方法を選択する必要があります。とにかくリソースが利用可能であるため...

于 2011-11-21T19:01:49.140 に答える