14

タイトルは本当にそれをすべて言います。

and ... は、pselect と ppoll も含めることを意味します。

私が取り組んでいるサーバー プロジェクトは、基本的に複数のスレッドで構成されています。各スレッドは、1 つ以上のセッションを処理します。すべてのスレッドは同一です。プロトコルは、どのスレッドがセッションをホストするかを処理します。

私は物事をまとめる社内ソケットクラスを使用しています。興味深い点は、poll (linux) または select (windows) のいずれかを呼び出す checkread 呼び出しです。

要約すると、現在、各スレッドは単一のソケットで poll を呼び出しています。私が知る限り、epoll を使用することは、このスレッドが HTTP サーバーなどの複数のソケットを参照している場合にのみ有効です。私の場合、それは私がしていることではありません。また、このクラスは一度に 1 つのソケットしか処理しません。

epoll のマニュアル ページには、エッジ トリガーとレベル トリガーに関する簡単な説明があります。それが何を意味するのかよくわかりません。ソケット クラスでは、ioctlsocket と FIONREAD を使用して選択呼び出しをショートカットし、データがあるかどうかを確認するコードの Windows 部分に最適化が見られます。呼び出し時に完全な UDP パケットが到着していなくても、それが > 0 を返すかどうか疑問に思っています。これは epoll のエッジ トリガーですか?

いくつかの初歩的なテストでは、select と poll の使用に目立った違いは見られません。

ppoll を使用すると、タイムアウトの精度が向上するため、利点があることがわかります。何かご意見は?

はい、大量のデータを受信するセッションのスループットを最適化しようとしています。サーバーは、CPU よりもネットワークとディスクにバインドされています。

4

3 に答える 3

7

epoll と select または poll の主な違いは、epoll はシングル スレッドで実行するとスケーリングが大幅に向上することです。これが、select または poll を使用してマルチスレッド サーバーを使用する場合とどのように比較されるかはわかりません。これを見てください http://monkey.org/~provos/libevent/libevent-benchmark2.jpg

この理由は (私が知る限り)、select または poll を使用している場合、接続されているすべてのソケットをループして、読み取るデータがあるソケットを特定する必要があるためです。epoll を使用している場合、読み取るデータがあるソケットへの参照のみを含む別の配列を保持します。これにより、多くのループ サイクルが節約され、接続されているソケットが増えるほど違いが顕著になります。

パフォーマンスが大きな問題になった場合に調べるべきもう 1 つのことは、io 完了ポート (Windows のみ) と kqueue (FreeBSD のみ) です。また、epoll は Linux のみであることを覚えておくことも重要です。ほとんどの場合、select または poll は問題なく機能します。

単一のファイル記述子の場合、select と poll は epoll よりもはるかに単純であるため効率的です。(epoll にはオーバーヘッドがあり、ソケットが 1 つだけでは役に立ちません)

于 2011-04-25T23:16:37.250 に答える
0

ソケットが 1 つしかない場合、そもそもポーリングのポイントは何ですか? 読み取り/書き込みのブロックを使用するだけで、最高のパフォーマンスが得られるのではないでしょうか?

に関して。ファイル記述子が 1 つしかない場合のパフォーマンスは、さまざまなアプローチに大きな違いはないと思います。本当に気にするなら、測定できると思いますが、これがプログラムの全体的なパフォーマンスにとって特に重要になるとは思いません。

レベル/エッジトリガー。簡単にするために、信号を監視していると考えてください。ラインの電圧を考えてみましょう。エッジトリガーとは、電圧が特定の制限を超えたり下回ったりしたときに何かがトリガーされることを意味します。レベルトリガーとは、電圧が制限を上回っている/下回っている限り、何かがトリガー状態にあると見なされることを意味します。つまり、エッジ トリガーは何らかのイベントが発生したとき (何らかのしきい値を超えたとき) にトリガーし、レベル トリガーは何らかの「もの」 (この場合は電圧) の状態を反映します。

ネットワーク プログラミングに戻ると、エッジ トリガー システムは、パケットを受信したときに何らかの信号を受け取るシステムである可能性があります。イベントを処理しないと、シグナルが失われます。レベル トリガー システムの OTOH は、「バッファーに待機しているデータはありますか?」と尋ねるようなものです。イベントを処理せずに再度要求しても、データは引き続き待機します。

于 2011-04-13T11:26:08.630 に答える