今日私は非常に奇妙な問題を発見しました。 Redhat Enterprise Linux 6を実行し、CPUはIntel E31275(4コア、8スレッド)でした。 1つのカーネルスレッド(my_threadという名前)が正しく動作しませんでした。 「PS」コマンドで 、私はmy_threadの状態を常に実行していたが見つかりました:スレッドのステータスは実行中ですが、CPUを使用しないのはなぜですか?
ps ax
5545 ? R 3:14 [my_thread]
15774 ttyS0 Ss 0:00 -bash
...
しかし、その実行時間は常に3時14分でした。それが走っているので、なぜ時間が増えなかったのですか? procファイル/ proc/5545/schedから、このスレッドのウェークアップカウント(se.nr_wakeups)を含むすべての統計値が常に同じであることがわかりました。
は/ procの/ 5545 /スタックから、私はこの関数を呼び出し、このスレッドを発見し、決して返さ:他のスレッドがスレッドを目が覚めていない場合
はinterruptible_sleep_on_timeout(&q, 3*HZ);
理論的には、この関数は3秒ごとに返します。関数が返されるたびに、/ proc/5545/schedのse.nr_wakeupsが1増加します。しかし、スレッドに問題があることが判明した後では、これは起こりませんでした。
いずれかのアイデアはありますか? interruptible_sleep_on_timeout()が返されない可能性はありますか?
更新: このスレッドでCPUアフィニティを設定すると問題は発生しません。それを専用のコアに固定すれば、すべてがOKです。 SMPスケジューリングに問題はありますか?
更新日: BIOSでハイパースレッドを無効にした後、今までこのような問題は見られませんでした。
スタック内の 'interruptible_sleep_on_timeout'は何ですか?これはカーネルスレッドですか? –