iotopコマンドの使い方
- 1 iotopコマンドとは?
- 2 検証環境
- 3 iotopコマンドのインストール方法
- 4 オプション一覧
- 5 Non-Interactiveモード(-b)
- 6 Interactiveモード
- Z 参考情報
1 iotopコマンドとは?
iotopはプロセス毎のディスクI/Oの帯域を表示するコマンドです。sar,vmstatはシステム全体のディスクI/Oの状況は確認できますが、プロセス毎の確認はできません。iotopを使うことで、ディスクI/O負荷の高いプロセスを特定することができます。
なお、vmstatコマンドの使い方は、vmstatコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。sarコマンドの使い方は、近日記事作成予定です。
2 検証環境
CentOS版数は以下のとおりです。
[root@server ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)
カーネル版数は以下のとおりです。
[root@server ~]# uname -r 3.10.0-1160.el7.x86_64
3 iotopコマンドのインストール方法
iotopパッケージをインストールします。
[root@server ~]# yum -y install iotop
iotopコマンドの版数を確認します。
[root@server ~]# iotop --version iotop 0.6
4 オプション一覧
オプションは以下のとおりです。
[root@server ~]# iotop --help Usage: /usr/sbin/iotop [OPTIONS] DISK READ and DISK WRITE are the block I/O bandwidth used during the sampling period. SWAPIN and IO are the percentages of time the thread spent respectively while swapping in and waiting on I/O more generally. PRIO is the I/O priority at which the thread is running (set using the ionice command). Controls: left and right arrows to change the sorting column, r to invert the sorting order, o to toggle the --only option, p to toggle the --processes option, a to toggle the --accumulated option, i to change I/O priority, q to quit, any other key to force a refresh. Options: --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)
5 Non-Interactiveモード(-b)
-bはバッチモードとも呼ぶようです。5章では、全て-bオプションを指定してiotopコマンドを実行してみます。
5.1 時刻を表示する方法(-t)
-tはiotopの実行時刻を表示するオプションです。左端(TIME列)がiotopの実行時刻です。
[root@server ~]# iotop -b -t
20:38:32 Total DISK READ :       0.00 B/s | Total DISK WRITE :       0.00 B/s
20:38:32 Actual DISK READ:       0.00 B/s | Actual DISK WRITE:       0.00 B/s
    TIME   TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN      IO    COMMAND
20:38:32      1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % systemd --switched-root --system --deserialize 22
20:38:32      2 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kthreadd]
20:38:32      4 be/0 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kworker/0:0H]
-snip-
5.2 iotopコマンドの実行間隔を変更する方法(-d)
-dはiotopの実行間隔を指定するオプションです。デフォルトは1秒です。ここでは3秒間隔で実行してみます。iotopの実行結果を確認すると、左端(TIME列)の1回目が20:58:53、2回目が20:58:56に実行されていることがわかります。
[root@server ~]# iotop -b -t -d 3
20:58:53 Total DISK READ :       0.00 B/s | Total DISK WRITE :       0.00 B/s
20:58:53 Actual DISK READ:       0.00 B/s | Actual DISK WRITE:       0.00 B/s
    TIME   TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN      IO    COMMAND
20:58:53      1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % systemd --switched-root --system --deserialize 22
20:58:53      2 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kthreadd]
20:58:53   1517 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % -bash
20:58:53   1011 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % rsyslogd -n [in:imjournal]
-snip-
20:58:56 Total DISK READ :       0.00 B/s | Total DISK WRITE :       0.00 B/s
20:58:56 Actual DISK READ:       0.00 B/s | Actual DISK WRITE:       0.00 B/s
    TIME   TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN      IO    COMMAND
20:58:56     60 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.01 % [kworker/0:1]
20:58:56      1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % systemd --switched-root --system --deserialize 22
20:58:56      2 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kthreadd]
5.3 I/Oを実行しているプロセスだけを表示する方法(-o)
-oはI/Oを実行しているプロセスだけを表示するオプションです。これを確認するため、stressコマンドを実行して、1バイトずつ128バイトを繰り返しファイルに書き込むプロセスを3つ生成します。なお、stressコマンドのインストール方法、使い方は、stressコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。
[root@server ~]# stress -d 3 --hdd-bytes 128M -q & [1] 1905
DISK WRITE列の値を確認すると、stressプロセスがディスクに書き込みをしていることがわかります。
[root@server ~]# iotop -b -o Total DISK READ : 0.00 B/s | Total DISK WRITE : 2.90 G/s Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 35.39 M/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND 1906 be/4 root 0.00 B/s 37.78 M/s 0.00 % 0.00 % stress -d 3 --hdd-bytes 128M -q 1907 be/4 root 0.00 B/s 108.32 M/s 0.00 % 0.00 % stress -d 3 --hdd-bytes 128M -q 1908 be/4 root 0.00 B/s 49.13 M/s 0.00 % 0.00 % stress -d 3 --hdd-bytes 128M -q -snip-
5.4 指定したプロセスだけを表示する方法(-p ) 
    -pはPIDで指定したプロセスのI/Oの状況を表示するオプションです。stressコマンドを実行して、ファイルへの書き込みを行うプロセスを3つ生成します。
[root@server ~]# stress -d 3 --hdd-bytes 128M -q & [1] 1578
psコマンドを実行します。PID1578のプロセスが親プロセス、その他が子プロセスとなります。親プロセスはwaitシステムコールを実行して、子プロセスの終了をまっています。なお、do_wait関数は、waitシステムコールの延長で呼び出すカーネル関数です。
[root@server ~]# ps -C stress -o comm,pid,ppid,wchan COMMAND PID PPID WCHAN stress 1578 1559 do_wait stress 1579 1578 - stress 1580 1578 - stress 1581 1578 -
ここでは、PID1581のプロセスのI/Oの状況を表示してみます。
[root@server ~]# iotop -b -p 1581 Total DISK READ : 0.00 B/s | Total DISK WRITE : 1188.48 M/s Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND 1581 be/4 root 0.00 B/s 1188.48 M/s ?unavailable? stress -d 3 --hdd-bytes 128M -q Total DISK READ : 0.00 B/s | Total DISK WRITE : 1064.10 M/s Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND 1581 be/4 root 0.00 B/s 42.34 M/s ?unavailable? stress -d 3 --hdd-bytes 128M -q -snip-
5.5 指定したユーザのI/Oだけを表示する方法(-u ) 
    私の環境ではhttpdプロセスが動作していたので、httpdプロセスを実行しているユーザ名を使ってI/Oの状況を確認してみました。
[root@server ~]# ps -C httpd -o comm,user,pid,ppid COMMAND USER PID PPID httpd root 1608 1 httpd apache 1609 1608 httpd apache 1610 1608 httpd apache 1611 1608 httpd apache 1612 1608 httpd apache 1613 1608
httpdプロセスを実行しているユーザ名を指定してiotopコマンドを実行します。ユーザ名がapacheのプロセスのI/Oの状況が確認できます。確認した時点では、ディスクへのI/Oはありませんでした。
[root@server ~]# iotop -b -u apache Total DISK READ : 0.00 B/s | Total DISK WRITE : 0.00 B/s Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND 1609 be/4 apache 0.00 B/s 0.00 B/s ?unavailable? httpd -DFOREGROUND 1610 be/4 apache 0.00 B/s 0.00 B/s ?unavailable? httpd -DFOREGROUND 1611 be/4 apache 0.00 B/s 0.00 B/s ?unavailable? httpd -DFOREGROUND 1612 be/4 apache 0.00 B/s 0.00 B/s ?unavailable? httpd -DFOREGROUND 1613 be/4 apache 0.00 B/s 0.00 B/s ?unavailable? httpd -DFOREGROUND -snip-
5.6 iotopの実行回数を指定する方法(-n)
-nはiotopの実行回数を指定するオプションです。systemdのI/Oの状況を2回表示したら、iotopコマンドを終了するようにしてみます。まず、systemdのPIDを確認します。
[root@server ~]# ps -C systemd
   PID TTY          TIME CMD
     1 ?        00:00:03 systemdsystemdのI/Oの状況を2回したあと、iotopコマンドが終了していることがわかります。
[root@server ~]# iotop -b -p 1 -n 2
Total DISK READ :       0.00 B/s | Total DISK WRITE :       0.00 B/s
Actual DISK READ:       0.00 B/s | Actual DISK WRITE:       0.00 B/s
   TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN      IO    COMMAND
     1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % systemd --switched-root --system --deserialize 22
Total DISK READ :       0.00 B/s | Total DISK WRITE :       0.00 B/s
Actual DISK READ:       0.00 B/s | Actual DISK WRITE:       0.00 B/s
   TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN      IO    COMMAND
     1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % systemd --switched-root --system --deserialize 22
[root@server ~]#
5.7 バッチモードで収集したログをファイルに保存する方法
systemdのI/Oの状況を5秒間隔でファイルに保存してみます。適当な時間経過したら、Ctrl+C押下してiotopコマンドを終了します。
[root@server ~]# iotop -b -p 1 -t -d 5 > iotop.txt
ファイルに保存したiotopコマンドの実行結果を確認してみます。
[root@server ~]# cat iotop.txt
19:43:46 Total DISK READ :       0.00 B/s | Total DISK WRITE :       0.00 B/s
19:43:46 Actual DISK READ:       0.00 B/s | Actual DISK WRITE:       0.00 B/s
    TIME   TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN      IO    COMMAND
19:43:46      1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % systemd --switched-root --system --deserialize 22
19:43:51 Total DISK READ :       0.00 B/s | Total DISK WRITE :       0.00 B/s
19:43:51 Actual DISK READ:       0.00 B/s | Actual DISK WRITE:       0.00 B/s
    TIME   TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN      IO    COMMAND
19:43:51      1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % systemd --switched-root --system --deserialize 22
19:43:56 Total DISK READ :       0.00 B/s | Total DISK WRITE :       0.00 B/s
19:43:56 Actual DISK READ:       0.00 B/s | Actual DISK WRITE:       0.00 B/s
    TIME   TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN      IO    COMMAND
19:43:56      1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % systemd --switched-root --system --deserialize 22
[root@server ~]#
6 Interactiveモード
[root@server ~]# stress -d 3 --hdd-bytes 128M -q & [1] 1741
psコマンドを実行して、stressプロセスのPIDを確認します。
[root@server ~]# ps -C stress -o comm,pid,ppid,wchan COMMAND PID PPID WCHAN stress 1741 1559 do_wait stress 1742 1741 - stress 1743 1741 - stress 1744 1741 -
ここでは、子プロセス(PID=1742,1743,1744)の状況だけを確認してみます。
[root@server ~]# iotop -p 1742 -p 1743 -p 1744
iotopコマンドを実行すると、以下の画面が表示されます。

6.1 トグルキー
トグルキーを押下することで、iotopコマンド実行結果の表示内容を切り替えることができます。
| トグルキー | Non-Interactiveモードのオプション名 | 意味 | 
|---|---|---|
| r | なし | 表示順序を逆にする。左右の矢印キーを押して、表示順序を逆にしたい項目を選択する(選択中の項目は黄色)。項目を選択したらrを押下する。もう一度rを押すと元に戻ります | 
| o | -o, --only | I/Oを実行しているプロセス/スレッドのみ表示する | 
| p | -P, --processes | プロセスのみ表示する。スレッドは表示しない | 
| a | -a, --accumulated | 帯域ではなく累積値を表示する | 
| q | なし | iotopコマンドを終了する | 
| i | なし | プロセス/スレッドの優先度変更 | 
iotopコマンドを実行します。

次にoを押下すると、I/Oを実行しているプロセスだけが表示されるます。

Z 参考情報
私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ

