GNU/Linux >> Linux の 問題 >  >> Linux

レベル トリガーとエッジ トリガーのどちらがパフォーマンスが高いですか?

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

エッジ トリガーの場合は、常に入力バッファーをドレインする必要があるため、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.)

Linux
  1. ファイルはいつ作成されましたか?

  2. Tar.gzを作成するときに余分なファイルを避けますか?

  3. ファイルがダウンロードされたことを検出することは可能ですか?

  1. Linux でのコマンド例

  2. .tar.gz ファイルの作成時にディレクトリを除外する

  3. fork() するときにファイル記述子は共有されますか?

  1. ディレクトリが存在すると mkdir -p が失敗する

  2. C で tmpfile() を使用する場合の一時ファイルの場所

  3. mkstemp() で作成されたファイルはいつ削除されますか?