今日、私は非常に奇妙な問題を見つけました。Redhat Enterprise Linux 6 を実行し、CPU は Intel E31275 (4 コア、8 スレッド) でした。1 つのカーネル スレッド (my_thread と呼んでいます) が正しく動作しないことがわかりました。「ps」コマンドを使用すると、my_thread のステータスが常に実行中であることがわかりました。
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/stack から、このスレッドがこの関数を呼び出し、返されないことがわかりました。
interruptible_sleep_on_timeout(&q, 3*HZ);
理論的には、この関数は、他のスレッドがスレッドを起こしていない場合、3 秒ごとに戻ります。関数が戻るたびに、/proc/5545/sched の se.nr_wakeups が 1 ずつ増加します。しかし、スレッドに問題があることがわかった後は、これは発生しませんでした。
誰にもいくつかのアイデアがありますか?interruptible_sleep_on_timeout() が戻らない可能性はありますか?
更新: このスレッドに CPU アフィニティを設定すると、問題は発生しないことがわかりました。専用のコアに固定すれば、すべて問題ありません。SMP スケジューリングに問題はありますか?
再更新: BIOS でハイパースレッドを無効にしてから、今までそのような問題は見られませんでした。