今回は、ディスクのIOでボトルネックが発生した際に役立つ iotop コマンドを紹介したいと思います。
KUSANAGI には、IO関連のコマンドとして他にも dstat コマンドもインストールされていますが、dstat コマンドがIO全体の状況把握に役立つのに対し、iotop コマンドはどのプロセスでIOが発生し、それがどの程度であるのかを明示してくれるので、どのプロセスがIOのボトルネックとなっているかを特定するのに役立ちます。
ただし、KUSANAGI にはデフォルトで iotop コマンドはインストールされていませんので、別途インストールを行う必要があります。といっても base リポジトリに含まれていますし、依存関係もなく軽量なので dnf コマンドですぐにインストールができます。
dnf install iotop
iotopコマンドの見方
iotop コマンドはオプションなしでもある程度問題なく使えます。オプションを指定しない場合は、1秒間隔で更新されてその間に発生したプロセスごとのリード、ライト、スワップイン、IOの割合を表示してくれます。
Total DISK READ : 103.68 K/s | Total DISK WRITE : 2.41 M/s
Actual DISK READ: 103.68 K/s | Actual DISK WRITE: 453.14 K/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
113608 be/4 mysql 0.00 B/s 0.00 B/s 0.00 % 0.28 % mysqld --basedir=/usr --datad~ea-99d0-e3e536f0ef8a:299276509
113628 be/4 mysql 0.00 B/s 430.10 K/s 0.00 % 0.19 % mysqld --basedir=/usr --datad~ea-99d0-e3e536f0ef8a:299276509
86133 be/4 httpd 57.60 K/s 844.83 K/s 0.00 % 0.16 % nginx: worker process
86131 be/4 httpd 46.08 K/s 0.00 B/s 0.00 % 0.14 % nginx: worker process
2227 be/4 root 0.00 B/s 3.84 K/s 0.00 % 0.07 % monit -I
ソートの変更
コマンド実行後の初期はIOの降順での表示になっており、項目名がハイライト表示されいます。
ソートを変更するには、キーボードの左右カーソルで変更可能となっており、これでリード、ライト、スワップイン順での表示に切り替えられます。
保守時に使える主なオプション
iotop には、指定できるオプションがいくつかありますが、その中で私がよく使うオプションを指定しておきたいと思います。
--version show program's version number and exit
-h, --help show this help message and exit
-o, --only only show processes or threads actually doing I/O
-b, --batch non-interactive mode
-n NUM, --iter=NUM number of iterations before ending [infinite]
-d SEC, --delay=SEC delay between iterations [1 second]
-p PID, --pid=PID processes/threads to monitor [all]
-u USER, --user=USER users to monitor [all]
-P, --processes only show processes, not all threads
-a, --accumulated show accumulated I/O instead of bandwidth
-k, --kilobytes use kilobytes instead of a human friendly unit
-t, --time add a timestamp on each line (implies --batch)
-q, --quiet suppress some lines of header (implies --batch)
IOが発生したプロセスのみ表示する o オプション
デフォルトでは、全プロセスを表示するのに対し、o オプションを指定すると、IOが発生したプロセスのみの表示に絞り込むことができます。IOのボトルネック把握のために使用する場合は、IOが発生していないプロセスの情報は不要なので、指定しておいたほうが見やすくなります。
なお、オプションを指定しないでも、コマンド実行後に o キーを押すことで絞り込むことができるので、覚えておくといいでしょう。
iotop -o
更新間隔を指定する d オプション
デフォルトの1秒間隔での更新では目が追いつかない場合は、d オプションで更新間隔を調整することが可能です。
o オプションと d オプションを併用すると、コマンド実行直後の表示のプロセス数が極端に少ないことに気が付きます。実行直後は更新間での実績が取れないため、ほぼコマンド実行時の瞬間の状況のみが表示されいるのではないかと思われます。
iotop -d 3
非インタラクティブモードの b オプション、更新回数を指定する n オプション
デフォルトでは画面を再描画して更新されるようになっていますが、b オプションを指定すると再描画ではなく追記されるようになります。
iotop の結果をファイルにリダイレクトするような場合、インタラクティブモードだと文字化けが発生してしまうので、b オプションを指定しておくと見やすくなります。また、n オプションで更新する回数を指定することができます。ファイルにリダイレクトするのであれば、(1回だと先に書いたようにコマンド実行直後の情報しか取得してくれないので2回が適当です)回数してしておけば必要な情報を取得した段階で終了となるので便利です。
iotop -o -b -n 2 -d 3 > io.txt
紹介してきたように iotop コマンドは、IO のボトルネック切り分けをするのに役立つ強力なコマンドです。
インストールされていないようであれば、是非インストールしてKUSANAGIを使いこなしてください。