3

私は高性能の tcp サーバーを開発するプロジェクトに取り組んでおり、epoll とマルチスレッドを使用することにしました。しかし、私はサーバーの設計が難しいと感じており、今ではこの 2 つの設計に非常に戸惑っています。

1 つのディスパッチャー、いくつかのワーカー、ディスパッチャーは epoll を使用してすべての接続をリッスンし、着信データをワーカーにディスパッチします。ワーカーは IO イベントを処理しません。

1つのリスナーは、リスニングイベントのみを処理し、新しい接続が来ると、それを受け入れてワーカーにディスパッチします.すべてのワーカーはepoll fdを持ち、この新しいソケットをリッスンします.

魔女の方が良いですか、それともより良いデザインですか?

ありがとう!</p>

4

4 に答える 4

4

簡単な答えはありません。どのタイプのサーバーが必要ですか?

  1. 多くの並列ショート接続 (標準 www)
  2. 多くの並列の非常に長い接続 (小規模から中規模のアップロード)
  3. 1と2の混合
  4. 非常に長い重い接続 (大きなアップロード)

どのサーバー (マシン) を使用しますか (128 x 弱い CPU/8 x 強力な CPU) ?

より普遍的なのは、1 つのディスパッチャー、いくつかのワーカー、ディスパッチャーが epoll を使用してすべての接続をリッスンし、着信データをワーカーにディスパッチし、ワーカーが IO イベントを処理しないことです。

于 2012-12-21T08:46:17.030 に答える
2

一般に、接続に関してあまり多くの仮定を行わない高性能アーキテクチャを考え出すことは非常に困難です。

私はその分野でいくつかの作業を試みましたが、いくつかの情報はhttp://nginetd.cmeerw.orgで入手できます。

基本的にepoll、単一のスレッド プールで単一の fd (エッジ トリガー モード) を使用しています。つまり、各スレッドは任意の作業 (新しい接続の受け入れ、データの読み取り、要求の処理、応答の送信) を実行できるため、追加のスレッド コンテキスト スイッチは必要ありません。このアーキテクチャの主な課題は、競合を最小限に抑えながら競合状態を発生させないように、同期を適切に行うことです。

于 2012-12-21T10:48:52.960 に答える
2

libeventはここで非常に役立ちます。あなたの問題を解決するために生まれました。概念実証を構築し、予想される最大負荷を供給して、実際のボトルネックがどこにあるかを測定します。次に最適化 - 「時期尚早の最適化は諸悪の根源です」

于 2012-12-21T08:59:44.253 に答える
1

このテーマに関する非常に優れたリソースはThe C10K problemです。

于 2012-12-21T08:19:22.720 に答える