weblog of key_amb

主にIT関連の技術メモ

IO負荷の高いプロセスを特定する方法

カーネルの I/O Accounting 機能を利用する

Linuxでカーネルのバージョンが 2.6.20 以降であれば、IO Accounting機能を使うとよい。
これが有効になっていれば、プロセス毎のI/O統計情報が /proc/${pid}/io に出力される。
…が、全プロセスについて、これを自前で分析するのは疲れるので、pidstat や dstat のようなツールを使うのが楽。

iodump

2.6.19 以前のカーネルではどうすればいいか。
例えば、iodump というツールがある。
これは以前 Maatkit に含まれていた Perl スクリプトである。
使い方としては、以下の通り。

# download iodump
wget http://maatkit.googlecode.com/svn-history/r5389/trunk/util/iodump

# prepare
dmesg -c
/etc/init.d/klogd stop
echo 1 > /proc/sys/vm/block_dump

# start reporting
while true; do sleep 1; dmesg -c; done | perl iodump
Ctrl-C # end reporting

# post process
echo 0 > /proc/sys/vm/block_dump
/etc/init.d/klogd start

iodump を実行し、Ctrl-C を押すと結果が出力され、どのプロセスがI/Oを使っていたかわかる。

プロセスアカウンティング機能を使う

RedHat系のOSであれば psacct、Debian系であれば pacct というパッケージを入れることで、この機能を使うことができるようになる。

accton ログファイル名

で、アカウンティングが開始され、ログファイルにログが記録される。
アカウンティング情報はプロセス終了後に記録されるので、プロセス実行中の負荷はわからないという制限がある。