Linux で実行されているマルチスレッドの C++ アプリケーションで strace を実行しました
数時間実行した後、約 12 秒間、どのスレッドも実行されませんでした。
タイムアウトで呼び出された未完了の select システム コールが、スレッドが中断される前に未完了であり、再開後に報告され、操作が完了するまでに 11.x 秒かかったことがわかりました。(タイムアウトはわずか 900ms)
これは、プロセスが長時間停止していたことを明確に示しています。
プロセス内のすべてのスレッドは、Linux のデフォルトのスケジューリング ポリシー (SCHED_OTHER) とデフォルトの優先度で作成されます。
同じボックスで別の 5 つの同様のアプリが実行されており、ソケットで大量のデータを受信するため、このアプリのように重い I/O バウンドになっています。しかし、ほとんどの場合、このアプリはスケジュールされた遅延を受けています。他のアプリは、これと同じスケジュール ポリシーと優先度、つまりデフォルトで作成されます。ほとんどの場合、このプロセスだけがブロックされるのはなぜですか?
データのレートが高くなる可能性があるため、このプロセスがよりビジーであるのと同様に、より I/O 集約的である可能性がありますか? では、Linux の動的な優先順位の調整がここで行われ、このプロセスが押し下げられたのでしょうか?