先週の金曜日に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。