エッジ トリガーとレベル トリガーのパフォーマンスに大きな違いがあるとは思えません。
エッジ トリガーの場合は、常に入力バッファーをドレインする必要があるため、1 つの役に立たない (EWOULDBLOCK を返すだけの) recv syscall があります。しかし、トリガーされたレベルでは、より多くの epoll_wait システムコールを使用できます。マニュアル ページで指摘されているように、レベル トリガー モードでは、飢餓を回避するのが少し簡単になる場合があります。
実際の違いは、複数のスレッドを使用する場合は、エッジ トリガー モードを使用する必要があることです (ただし、同期を正しく行うには注意が必要です)。
違いは、長時間のセッションを使用し、バッファーがいっぱい/空であるために (通常はプロキシを使用して) 常に停止/開始を余儀なくされている場合にのみ表示されます。これを行っているときは、ほとんどの場合、イベント キャッシュが必要です。イベント キャッシュがイベントを処理しているときは、ET を使用して、すべての epoll_ctl(DEL)+epoll_ctl(ADD) ダンスを回避できます。 ET の場合、FD でのポーリングを有効にするために少なくとも 1 回の epoll_ctl(ADD) 呼び出しが必要であり、セッションの存続期間中にそれ以上の呼び出しが予想されない場合、節約はあまり明白ではありません。 (例:ほとんどの場合、交換はバッファよりも小さい)、違いは期待できません。カーネル バッファのおかげで、多くの操作 (例:書き込み) をポーリングせずに実行できることが多いため、一般に、節約のほとんどはイベント キャッシュのみを使用することで得られます。
エッジ トリガー インターフェイスとして使用する場合、パフォーマンス上の理由から、(EPOLLIN|EPOLLOUT) を指定することにより、epoll インターフェイス (EPOLL_CTL_ADD) 内にファイル記述子を 1 回追加することができます。これにより、EPOLL_CTL_MOD を使用して epoll_ctl(2) を呼び出して EPOLLIN と EPOLLOUT を連続的に切り替えることを回避できます。
Q9 EPOLLET フラグ (エッジ トリガー動作) を使用する場合、EAGAIN までファイル記述子を継続的に読み書きする必要がありますか?
A9 Receiving an event from epoll_wait(2) should suggest to you that
such file descriptor is ready for the requested I/O operation. You
must consider it ready until the next (nonblocking) read/write
yields EAGAIN. When and how you will use the file descriptor is
entirely up to you.
For packet/token-oriented files (e.g., datagram socket, terminal in
canonical mode), the only way to detect the end of the read/write
I/O space is to continue to read/write until EAGAIN.
For stream-oriented files (e.g., pipe, FIFO, stream socket), the
condition that the read/write I/O space is exhausted can also be
detected by checking the amount of data read from / written to the
target file descriptor. For example, if you call read(2) by asking
to read a certain amount of data and read(2) returns a lower number
of bytes, you can be sure of having exhausted the read I/O space
for the file descriptor. The same is true when writing using
write(2). (Avoid this latter technique if you cannot guarantee
that the monitored file descriptor always refers to a stream-ori‐
ented file.)