私は約80スレッドのプログラムを持っています。これは、Linux 3.36の〜50ishのコアマシンで実行されています。多くの場合、これらのプログラムは2つ同時に実行されますが、それらは同じです。他のものはマシン上で実行されていません。私のプログラムのこのスレッドはなぜ飢えているのですか?
スレッド自体は、SCHED_RR(ラウンドロビン)ポリシーを使用したリアルタイムのLinux pthreadです。
- 10が最も優先されます(ulimitを99に設定します)。cpuアフィニティがコアの10に設定されています。言い換えれば、彼らはそれぞれ自分のコアに固定されています。
- 約60が中優先です。
- 約10が優先されます。
最高優先順位のスレッドは、常にCPUを使用しています。
残りの部分はネットワークIOだけでなく、CPU上でいくつかの作業をしています。ここに問題があります:低優先度のスレッドの1つが飢えていることがあります。時には15秒以上かかることもあります。この特定のスレッドは、いくつかのデータのためにTCPソケット上で待機しています。接続の反対側にあるサーバーがデータを送信したことがわかります(つまり、データを送信した後にタイムスタンプを記録しています)ので、データが完全に送信されたことがわかります。通常、スレッドの受信と処理にはミリ秒かかりますが、他のサーバーが正常にデータを送信してから15秒かかることがあります。スレッドの優先度を上げてCPUに固定することで、この問題は解消されましたが、これは長期的な解決策ではありません。私はこの行動を最初に期待しません.15秒は非常に長い時間です。
これはなぜ起こっているのでしょうか?私たちはそれがプログラム/スレッド内のロジックのいずれかであることを排除しました。また、プログラムはC言語で書かれていることに注意してください。
unix.stackexchange.comで質問することもできます。ご存知のように、もしあなたが本当に「あなたのプログラム」に関するものではないと確信が持てば、あなたの質問は実際にはここで話題にならないでしょう! – GhostCat