• ベストアンサー

UNIX/Linuxで「プロセスごとの」ディスクの使用状況(ディスクI/Oの状況)を取得する方法

お世話になっております。 UNIX/Linuxで「プロセスごとの」ディスクの使用状況(ディスクI/Oの状況)を取得する方法を探しています。 ディスクの使用状況を取得するコマンドにはiostatコマンドやsarコマンドなどが ありますが、これはシステム全体のディスク使用状況しか取得できず プロセスごとのディスク使用状況は取得できません…。 具体的な状況としては以下です。 プロセス1~5の、5つのプロセスから成るソフトがあります。 ソフトを起動すると、プロセス1~5が起動し それぞれのプロセスがディスクにアクセスします。 このとき特定のプロセスの(例えばプロセス2の)ディスクの使用状況(I/O回数)を取得したいのです。 これを実現できるコマンドや方法を知っている方いらっしゃいましたら、ご教示ください。 以上です。よろしくお願い致します。

みんなが選んだベストアンサー

  • ベストアンサー
  • annyg2
  • ベストアンサー率50% (8/16)
回答No.5

質問者様は既に放置されているようなので、このページを参照している他の方のためにメモします。 (質問者様の環境のように、/proc以下にioディレクトリがない環境では使えません) まず、I/Oが激しいプロセスを特定する方法は以下の通りです。 (root)# find /proc -name io | xargs egrep "write|read" | sort -n -k 2 すると以下のようなフォーマットでI/Oの一覧が出力されます。下に行くほどI/Oが多いプロセスになるようにsortされています。 /proc/3847/io:read_bytes: 82096128 この場合、"3847"というのがプロセスID、最後がバイト数です。 上記の一覧から、どのプロセスがあやしいか、だいたい当たりをつけます。 次はそれがどのプログラムかですが、例えば上記の3847であれば、以下の方法で得ることができます。 (root)# ls -l /proc/3847 | awk 'length($11)!=0 {print $11}' これで、デバイスにアクセスしているプロセスが分かりました。 次に、このプロセスがどのファイルを読み書きしているかです。 再び3847を例にすると、以下で当たりをつけます。 (root)# strace -p 3847 -f -e pwrite,pread すると以下のようなフォーマットで大量の文字列が表示されます。 [pid 3847] pwrite(20, "v\2\0\0S\20\273\0<\3\0\0\260\1\0\0\344\1\5\1\f \10\254\17\\\16"..., 4096, 3391488) = 4096 [pid 3847] pwrite(21, "v\2\0\0w\367\272\0\240\6\0\0T\0\0\\0\3\0\210\17\2\3\364\17\230\17\210\17"..., 4096, 6946816) = 4096 [pid 3847] pwrite(21, "v\2\0\0y\340\301\0\243\0\0\0\0\0\\0\6\4\0\0\2610\1\fp\t\\\16`\r"..., 4096, 667648) = 4096 [pid 3847] pwrite(21, "v\2\0\0\301\0\245\0\0\0\0\0\0\0z\0\0\0\24\0p\t\1\fp\t\f\rX\17"..., 4096, 675840) = 4096 [pid 3847] pwrite(20, "v\2\0\0wj\276\0/\3\0\0\266\1\0\0\24\0p\t\1\f\260\16\\\16\264\r"..., 4096, 172032) = 4096 [pid 3847] pwrite(20, "v\2\0\0G\0\370\2\0\0\360\0\0\0\22\0\30\n\1\f\30\nl\n\300\n"..., 4096, 4370432) = 4096 [pid 3847] pwrite(21, "v\2\0\0;\212\27376\0\0\0\0\0\24\0p\t\1\f\270\fp\t\\\16"..., 4096, 6021120) = 4096 適当なところで、ctrl-cで止めます。 それぞれの行の、最初の引数の"20"とか"21"というのがアクセスされているファイルのファイルディスクリプタです。(言うまでもなく、20と21は別のファイルです) これらのファイルディスクリプタが具体的にどのファイルに対応しているかは、以下のコマンドで分かります。(例は、プロセスIDが3847、ファイルディスクリプタが20の場合) (root)# readlink /proc/3847/fd/20 これで、どのプロセスがどのファイルをアクセスしているかが分かります。 自分はできていませんが、もしかしたらシェルスクリプトなどにまとめることもできるかもしれません。もし実際にやった方がいたら、またこのページの回答欄から共有していただけることを期待しつつ、、、 以上です。

その他の回答 (4)

noname#70551
noname#70551
回答No.4

iotopでプロセスごとのI/Oをリアルタイムに監視することができます。 詳しくは下記をどうぞ。 http://gigazine.net/index.php?/news/comments/20080727_iotop/ kernelのバージョンが古いと動かないのが難点ですが便利ですよ。

参考URL:
http://gigazine.net/index.php?/news/comments/20080727_iotop/
taiyakisun
質問者

お礼

ありがとうございます! けっこう調べたつもりでしたが、こんな便利なものもあったんですね… 活用してみます。

  • Gizensha
  • ベストアンサー率34% (207/608)
回答No.3

ubuntuですが「システム・モニタ」にて特定のプロセスが使用中のファイルまでは見ることができました。 ま、参考までに。

taiyakisun
質問者

お礼

ありがとうございます。参考にさせていただきます!

回答No.2

/proc/<PID>/io があればそこでディスク I/O情報が取れるようです。 kernelのバージョンなのかコンパイルの仕方なのか、あるものとないものがあるようで、その違いは私もよくわかりませんが。

taiyakisun
質問者

お礼

お返事遅くなって申し訳ないです。 ありがとうございます! 確認してみたところioはありませんでしたが、参考にさせていただきます。

noname#96023
noname#96023
回答No.1

hpのglanceplusを買えばできます。確かlinux用もあるはず ちょっと高いですが、、、30万~40万くらいかな

taiyakisun
質問者

お礼

早速のレスありがとうございます。 高いですね~(汗) 標準的なコマンドで実現できたら一番いいんですが・・・

関連するQ&A