私が使用したシステムコールのための私のコードをプロファイリングしていますstrace
。私はいくつかの驚くべき結果を発見しました。200MBのデータのネットワーク転送をしながらトレースショー47254単一バイトがファイルディスクリプタ5に書き込みます。
write(5, "\1", 1)
この書き込みは何を意味するのでしょうか?FD 5とは何ですか?それはどこから発信されるだろうか?見つける方法はありますか?
私は非常によく、Linuxの基礎に精通していないです。
の出力 ls -lrt /proc/24393/fd
lrwx------ 1 95th 95th 64 Mar 1 20:56 9 -> 'socket:[97676]'
lr-x------ 1 95th 95th 64 Mar 1 20:56 7 -> /dev/random
lr-x------ 1 95th 95th 64 Mar 1 20:56 6 -> /dev/urandom
l-wx------ 1 95th 95th 64 Mar 1 20:56 5 -> 'pipe:[98345]'
lr-x------ 1 95th 95th 64 Mar 1 20:56 4 -> 'pipe:[98345]'
lrwx------ 1 95th 95th 64 Mar 1 20:56 3 -> 'anon_inode:[eventpoll]'
lrwx------ 1 95th 95th 64 Mar 1 20:56 2 -> /dev/pts/0
lrwx------ 1 95th 95th 64 Mar 1 20:56 1 -> /dev/pts/0
lrwx------ 1 95th 95th 64 Mar 1 20:56 0 -> /dev/pts/0
(それはあまり助けにはならなかったが)私は、そのパイプが何であるかをチェックします。
/proc/24393/fd$ lsof | grep 98345
btrs 24393 95th 4r FIFO 0,11 0t0 98345 pipe
btrs 24393 95th 5w FIFO 0,11 0t0 98345 pipe
tokio-run 24393 24394 95th 4r FIFO 0,11 0t0 98345 pipe
tokio-run 24393 24394 95th 5w FIFO 0,11 0t0 98345 pipe
tokio-run 24393 24395 95th 4r FIFO 0,11 0t0 98345 pipe
tokio-run 24393 24395 95th 5w FIFO 0,11 0t0 98345 pipe
これらの書き込みは、それらがファイルディスクリプタ・トリガー以外の何かによって起こされたときに、イベントがepoll_waitのシステムコールであるワーカースレッドをウェイクアップする(トキオ実装の一部として)MIOで使用されています。スレッドがシステムコールのOSでブロックされているので、これはそれらのブロックを解除するためにOSを伝えるために、ある種のシステムコールを必要とします。これは、チャネルで発生することができます。あなたはこれを見ている場合、それはあなたがアイドル状態にある労働者を持ってお勧めします。このシステムコールを使用する代替案は、ポーリングbusywait(はるかに高価なシステムコールとCPU時間の)で、またはそれらは、外部I / O(あなたの同時実行を制限する)によって起こされるまで、ちょうどすべての労働者を使用しないようにそれらのスレッドを維持することです。私は、あなたが、これらは実際にパフォーマンスへの影響や他の場所で、アプリケーションのボトルネックに起因しているかどうかを見てお勧めします。