1

Linux で実行されているマルチスレッドの C++ アプリケーションで strace を実行しました

数時間実行した後、約 12 秒間、どのスレッドも実行されませんでした。

タイムアウトで呼び出された未完了の select システム コールが、スレッドが中断される前に未完了であり、再開後に報告され、操作が完了するまでに 11.x 秒かかったことがわかりました。(タイムアウトはわずか 900ms)

これは、プロセスが長時間停止していたことを明確に示しています。

プロセス内のすべてのスレッドは、Linux のデフォルトのスケジューリング ポリシー (SCHED_OTHER) とデフォルトの優先度で作成されます。

同じボックスで別の 5 つの同様のアプリが実行されており、ソケットで大量のデータを受信するため、このアプリのように重い I/O バウンドになっています。しかし、ほとんどの場合、このアプリはスケジュールされた遅延を受けています。他のアプリは、これと同じスケジュール ポリシーと優先度、つまりデフォルトで作成されます。ほとんどの場合、このプロセスだけがブロックされるのはなぜですか?

データのレートが高くなる可能性があるため、このプロセスがよりビジーであるのと同様に、より I/O 集約的である可能性がありますか? では、Linux の動的な優先順位の調整がここで行われ、このプロセスが押し下げられたのでしょうか?

4

1 に答える 1

1

Linuxでの優先順位とプロセスのスケジューリングは、CPU時間にのみ関連しています。実際、プロセススケジューラは、CPUでの実行を待機するプロセスのみを考慮します。I / Oを待機するプロセス/スレッドは、プロセススケジューラではなく、I/Oスケジューラによって処理されます。

于 2012-06-21T10:21:54.737 に答える