13

私は、よりパフォーマンスの高い、エッジトリガーまたはレベルトリガーの epoll を見つけようとしています。

主に「パフォーマンス」を次のように考えています。

  1. 劣化することなく複数の接続を処理する機能。

  2. 受信メッセージごとに最高速度を維持する機能。

実は2の方が気になりますが、1も重要です。

私は、単一のスレッド化されたコンシューマー (を使用して複数のソケット接続を受け入れる/読み取るepoll_wait) と複数のプロデューサーを使用してテストを実行してきました。

これまでのところ、最大 1000 個のファイル記述子でさえ、違いは見られませんでした。

私は、受信される割り込みが少なくなるため、エッジ トリガーのパフォーマンスが向上するはずであるという考え (妄想?) の下で取り組んできました。これは正しい仮定ですか?

パフォーマンスの違いを隠している可能性がある私のテストの問題の 1 つは、受信したメッセージをスレッドにディスパッチしないことです。「タイムスタンプ」を取得するために使用してきたため、このテストを行う__asm__ rdtscのが嫌だったので、元のタイムスタンプがどのコアから来たのかを調整する必要はありません。

さらに疑わしいのは、私が見たいくつかのベンチマークで、レベル トリガー epoll のパフォーマンスが優れていることです。

どちらが良いですか?どのような状況で?違いはありませんか?任意の洞察をいただければ幸いです。

私のソケットはノンブロッキングです。

4

3 に答える 3

14

エッジトリガーとレベルトリガーの間に大きなパフォーマンスの違いがあるとは思いません。

エッジ トリガーの場合は、常に入力バッファーを空にする必要があるため、役に立たない (EWOULDBLOCK を返すだけの) recv syscall が 1 つあります。しかし、トリガーされたレベルでは、より多くの epoll_wait システムコールを使用できます。マニュアルページが指摘しているように、レベルトリガーモードでは飢餓を避けるのが少し簡単かもしれません.

実際の違いは、複数のスレッドを使用する場合は、エッジ トリガー モードを使用する必要があることです (ただし、同期を正しく行うには注意が必要です)。

于 2012-12-13T09:24:21.097 に答える
4

違いは、長時間のセッションを使用し、バッファーがいっぱい/空であるために (通常はプロキシを使用して) 常に停止/開始を余儀なくされている場合にのみ表示されます。これを行っているときは、ほとんどの場合、イベント キャッシュが必要です。イベント キャッシュがイベントを処理しているときは、ET を使用して、すべての epoll_ctl(DEL)+epoll_ctl(ADD) ダンスを回避できます。ET の場合、FD でのポーリングを有効にするために少なくとも 1 回の epoll_ctl(ADD) 呼び出しが必要であり、セッションの存続期間中にそれ以上の呼び出しが予想されない場合、節約はあまり明白ではありません。 (例: ほとんどの場合、交換はバッファよりも小さい)、違いは期待できません。カーネル バッファのおかげで、多くの操作 (例: 書き込み) をポーリングせずに実行できることが多いため、通常、節約のほとんどはイベント キャッシュのみを使用することで得られます。

于 2014-11-18T18:10:58.977 に答える