2016-10-19 5 views
1

私は約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言語で書かれていることに注意してください。

+0

unix.stackexchange.comで質問することもできます。ご存知のように、もしあなたが本当に「あなたのプログラム」に関するものではないと確信が持てば、あなたの質問は実際にはここで話題にならないでしょう! – GhostCat

答えて

1

私はこの動作を最初に期待しません.15秒は非常に長い時間です。

あなたの60中優先度のスレッドは、すべての実行可能だった場合、それはあなたが期待まさにだ:まだ実行可能なより高い優先度のスレッドがありますしながら、リアルタイムのスレッドで、次に優先順位の低いスレッドは、すべてのでを実行しません。

perf timechartを使用して、何が起こっているのかを正確に分析することができます。

+0

ポリシーはラウンドロビン方式です。私は、RRスケジュール政策との優先事項についてどのように誤解していますか? – rvishy1

+0

@ rvishy1:[sched(7) '](http://manpages.org/sched/7)のマニュアルページを参照してください。より高い静的優先順位を持つスレッドは、より低い静的優先順位を持つスレッドに優先して実行されます。* "スケジューリング方針は、静的優先順位が等しい実行可能スレッドのリスト内でのみ順序付けを決定します。" *(この場合、SCHED_RR )。 – caf

関連する問題