ディスクIOで悩む時、どのプロセスがIOを出しているのか分らないときがある。

CentOS 5.4 以降、/proc/[PID]/io というファイルが有って、ここにプロセスがどんだけI/Oを出したか分るようになっている。
参考URL <http://www.sssg.org/blogs/naoya/archives/1562 >

以下のコマンドでも打てる。sysstatやdstatを入れる必要がある。

pidstat -d
dstat -M topbio -al

(ただしdstat はver0.6.7以降)

/proc/[PID]/io の書式というか例はこんな感じ。

rchar: 1304456
wchar: 7493
syscr: 2825
syscw: 20
read_bytes: 110592
write_bytes: 16384
cancelled_write_bytes: 0

以下URLによると、read_bytes と、write_bytes が、ストレージアクセス発生したIOのようです。
<http://stackoverflow.com/questions/3633286/understanding-the-counters-in-proc-pid-io >

これでIOの出元を調べられる!

何らかの理由でpidstat も、dstatも、iotopも、何も使えない人へ。

/proc/[PID]/io ファイルを全部見るのは大変なので、
とりあえず、bash でPID write_bytes をsortする一文を書きました。
for file in `ls /proc/*/io`; do echo $file `cat $file |egrep ^write_bytes |awk '{print $NF}'`; done | sort -k 2 -r -n
こんな感じでPIDを特定して、grep してps 打てばどのプロセスか分かるはずです。例えば、
ps ax |grep PID
とかです。