iotopでLinuxのプロセス毎のディスクI/Oを監視する

Linux Tool

Linux のディスクI/O関連でパフォーマンスに問題が発生した場合に利用できるコマンド iotop に関して書きます。

はじめに

Ganglia 関連のドキュメントをまとめている際にLinuxのI/Oを監視する方法について改めてまとめていました。
当初 Ganglia 自身の cpu_wio や vmstat、及び、sar コマンドで I/O待ちの調査をしていたのですが、これらではPC全体での状態は確認できますが、プロセス毎の情報は確認できません。

/proc/<PID>/io の状態をチェックして問題があるプロセスを絞り込む方法もあるようですが、結構大変です。

iotop コマンドは top コマンドのように I/O 処理が発生しているプロセスをリアルタイムでモニタリングする事が可能です。

以下、利用方法に関して簡単に記します。
※恥ずかしながら iotop コマンドに関してはここ最近で知りました

環境

環境は以下になります。

OS CentOS 6.7
iotop 0.3.2-7

使い方

インストール

yum でインストール可能です。

# yum install iotop

実行方法

実行はコマンドを入力すればOKです。

# iotop

オプションを指定しない場合、以下のような出力が行われ、1秒間隔で更新されます。
終了する場合 'q' キーを押して下さい。

Total DISK READ: 31.13 K/s | Total DISK WRITE: 19.46 K/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
 7980 be/4 ganglia    15.57 K/s   15.57 K/s  0.00 %  2.91 % rrdcached -p /va~ -z 1800 -f 3600
 7983 be/4 ganglia    15.57 K/s   15.57 K/s  0.00 %  2.91 % rrdcached -p /va~ -z 1800 -f 3600
    1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % init
    2 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kthreadd]
    3 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [migration/0]
    4 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/0]
    5 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [stopper/0]
    6 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [watchdog/0]
    7 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [events/0]
    8 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [events/0]
    9 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [events_long/0]
   10 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [events_power_ef]

トグルキー

通常のモード(バッチモードでない)で実行した場合、以下トグルキーが有効のようです。
表示モードの変更が行われるキーに関しては、押す度にモードが切り替わります。

キー
q終了
oI/O処理を実施しているプロセス/スレッドのみ表示
pプロセスのみ表示(スレッドは表示しない)
aI/O帯域幅(バイト/秒)ではなく累積値(バイト)を表示
iPID to ionice. PIDを指定してionice指定が可能
u表示の更新

※他にもあるかもしれません。

コマンドラインオプション

コマンドラインオプションは以下になります。

オプション
--versionバージョンの表示
-h, --helpヘルプの表示
-o, --onlyI/O処理を実施しているプロセス/スレッドのみ表示
-b, --batchバッチモード
-n 数値, --iter=数値終了までのモニタ回数(指定しない場合無限)
-d 秒, --delay=秒モニタ間隔を指定(指定しない場合1秒)
-p PID, --pid=PIDモニタするプロセスのPIDを指定
-u USER, --user=USERモニタするプロセスのユーザを指定
-P, --processesプロセスのみ表示(スレッドは表示しない)
-a, --accumulatedI/O帯域幅(バイト/秒)ではなく累積値(バイト)を表示
-k, --kilobytesキロバイト表示
-t, --timeタイムスタンプを表示(バッチモード)
-q, --quietヘッダ表示の抑制(バッチモード)

まとめ

iotop を利用するになってから、どのプロセスが問題 ( I/O待ち状態 ) になっているかを特定するのが大分楽になりました。
利用したことがない方は使ってみると便利かもしれません。