- 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 systemd
systemdの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技術ブログ