kworkerがLinux 3.0.0-12-serverでそれほど多くのリソースを消費するのはなぜですか?

kworkerがLinux 3.0.0-12-serverでそれほど多くのリソースを消費するのはなぜですか?

先週の金曜日にUbuntuサーバーを11.10にアップグレードし、現在3.0.0-12サーバーカーネルを実行しています。その時点から、全体的なパフォーマンスが急激に低下しました。アップグレード前のシステム負荷は0.3程度でしたが、現在16GB RAM(10GB使用可能、スワップ使用不可)を備えた8コアCPUシステムでは、システム負荷は22~30です。

[md1_raid1]と[btrfs-transacti]が多くのリソースを消費しているため、BTRFSファイルシステムドライバとデフォルトのMDアレイを非難しようとしました。しかし、すべての[kworker / *:*]は多くを消費します。

sar金曜日から以下の内容が出力されました。

11:25:01        CPU     %user     %nice   %system   %iowait    %steal     %idle 
11:35:01        all      1,55      0,00     70,98      8,99      0,00     18,48 
11:45:01        all      1,51      0,00     68,29     10,67      0,00     19,53 
11:55:01        all      1,40      0,00     65,52     13,53      0,00     19,55 
12:05:01        all      0,95      0,00     66,23     10,73      0,00     22,10 

そしてiostat書き込み速度が非常に低いことを確認しました。

sda             129,26      3059,12       614,31  258226022   51855269          
sdb              98,78        24,28      3495,05    2049471  295023077          
md1             191,96       202,63       611,95   17104003   51656068          
md0               0,01         0,02         0,00       1980        109          

問題は、kworkerスレッドがなぜそれほど多くのリソース(そしてどのリソース)を消費するのかを調べる方法です。またはより良い方法があります。これは3.0カーネルの既知の問題ですか?カーネルパラメータを使用して調整できますか?

編集する:

BTRFS開発者の推奨に従って、カーネルを新しいバージョン3.1にアップデートしました。しかし残念ながら、これは何も変えません。

ベストアンサー1

私が見つけたlmlのこのスレッドこれはあなたの質問に多少答えられます。 (Linus自身も、このスレッドがどこから来たのかを調べる方法について混乱しているようです。)

基本的にこれを行うには2つの方法があります。

$ echo workqueue:workqueue_queue_work > /sys/kernel/debug/tracing/set_event
$ cat /sys/kernel/debug/tracing/trace_pipe > out.txt
(wait a few secs)

これにはあなたが必要ですカーネルでコンパイルし、以下を使用して有効にします。

mount -t debugfs nodev /sys/kernel/debug

Linux 関数追跡ツールの詳細については、次を参照してください。ftrace.txt ドキュメント

これは、スレッドが実行するアクションを出力し、複数の小さなタスクを追跡するのに役立ちます。

cat /proc/THE_OFFENDING_KWORKER/stack

これにより、多くのタスクを実行する単一スレッドのスタックが出力されます。これにより、特定のスレッドがCPUを消費する原因が何であるかを判断できます(例:)。THE_OFFENDING_KWORKERプロセスリストにあるkworkerのpid。

おすすめ記事