2011-10-21 9 views
2

今日私は非常に奇妙な問題を発見しました。 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でハイパースレッドを無効にした後、今までこのような問題は見られませんでした。

+0

スタック内の 'interruptible_sleep_on_timeout'は何ですか?これはカーネルスレッドですか? –

答えて

4

最初にオフになっていれば、Rはスレッドが実行中ではなく実行可能であることを示します。つまり、スケジューラーが実行するためにスケジューラーが選択できる状態にあることを意味します。両者には大きな違いがあります。

同様の意味で、interruptible_sleep_on_timeout(& q、3 * HZ); 3つのjiffiesの後でスレッドを実行するのではなく、3つのjiffiesの後で実行できるようにします。実際には "ps"で実行可能な状態になっているので、おそらくタイムアウトが発生している可能性があります。

問題のカーネルスレッドについて何も言わなかったので、自分自身のコードに含まれているか標準のカーネルコードであるかわからないので、本当に詳細に答えることはできません。

説明した状況の1つの理由は、他のスレッド(ユーザーまたはカーネル)がスレッドよりも高い優先度を持ち、スケジューラが実行のためにそれを選択しないということです。そうであれば、おそらくリアルタイム優先度(SCHED_FIFOまたはSCHED_RR)で実行されているスレッドではありません。

+0

ご返信ありがとうございます。この問題が発生したとき、システムはアイドル状態でした。 CPUアイドル率は99%以上でした。 – flypen

+0

更新:このスレッドのCPUアフィニティを設定すると問題は発生しません。それを専用のコアに固定すれば、すべてがOKです。 SMPスケジューリングに問題はありますか? – flypen

関連する問題