1 iotopコマンドとは?
iotopはプロセス毎のディスクI/Oを監視するツールです。
sar,vmstatはシステム全体のディスクI/Oの状況は確認できますが、プロセス毎の確認はできません。
iotopを使うことで、ディスクI/O負荷の高いプロセスを特定することができます。
2 環境
VMware Workstation 12 Player上の仮想マシンを使用しました。
[root@admin ~]# cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
[root@admin ~]# yum -y install kernel
[root@admin ~]# shutdown -r now
[root@admin ~]# uname -r
3.10.0-514.26.2.el7.x86_64
iotopコマンドを実行するとエラー(*)が発生するため、カーネル版数をアップしました。
(*)「CONFIG_TASK_DELAY_ACCTが有効になっていない」
3 事前準備
3.1 iotopコマンドのインストール
[root@admin ~]# yum -y install iotop
[root@admin ~]# iotop --version
iotop 0.6
3.2 stressコマンドのインストール
ディスクへの書き込み負荷をかけるため、stressコマンドを使います。
stressの使い方は「stressコマンドの使い方」を参照してください。
stressコマンドはepelリポジトリにあるので、事前にepel-releaseパッケージをインストールする。
[root@admin ~]# yum -y install epel-release
[root@admin ~]# yum -y install stress
[root@admin ~]# stress --version
stress 1.0.4
4 iotopコマンドのオプション
root@admin ~]# 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 Interactiveモード
Interactiveモードにおける実行結果表示画面を以下に示します。
ディスクアクセス負荷をかける。
[root@admin ~]# stress -d 3 --hdd-bytes 128M -q &
[root@admin ~]# ps -LC stress -o comm,pid,ppid
COMMAND PID PPID
stress 4139 1060
stress 4140 4139
stress 4141 4139
stress 4142 4139
topコマンドを実行する。
[root@admin ~]# top
5.1 トグルキー
トグルキーを押下することで、iotopコマンド実行結果の表示内容を切り替えることができます。
man iotopより抜粋
Use the left and right arrows to change the sorting, r to reverse the sorting order, o to toggle the --only option, p to toggle the --processes option, a to toggle the --accumulated option, q to quit or i to change the priority of a thread or a process' thread(s). Any other key will force a refresh.
トグルキー | 同じ機能のオプション名 | 意味 |
---|---|---|
r | なし | 表示順序を逆にする。左右の矢印キーを押して、表示順序を逆にしたい項目を選択する(選択中の項目は黄色)。項目を選択したらrを押下する。もう一度rを押すと元に戻ります。 |
o | -o, --only | I/O処理を実施しているプロセス/スレッドのみ表示 |
p | -P, --processes | プロセスのみ表示(スレッドは表示しない) |
a | -a, --accumulated | 帯域ではなく累積値の表示 |
q | なし | iotopコマンド終了 |
i | なし | プロセス/スレッドの優先度変更 |
6 Non-Interactiveモード(-b)
バッチモードとも呼ぶようです。
以降の例は、すべて-bオプションを指定しています。
6.1 iotopコマンドの実行間隔を変更する方法(-d)
デフォルトは1秒です。iotopコマンドを2秒間隔で実行する例を以下に示します。
[root@admin ~]# iotop -b -d 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 rt/2 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % systemd --switched-root --system --deserialize 21
2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd]
3 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0]
7 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/0]
-以下、略-
6.2 時刻を表示する方法(-t)
-tオプションを付けることで、iotopコマンド実行結果に時刻を表示(左端)することができます。
[root@admin ~]# iotop -b -t
20:34:44 Total DISK READ : 0.00 B/s | Total DISK WRITE : 0.00 B/s
20:34:44 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:34:44 1 rt/2 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % systemd --switched-root --system --deserialize 21
20:34:44 2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd]
20:34:44 3 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0]
20:34:44 7 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/0]
-以下、略-
6.3 I/Oを実行しているプロセスだけを表示する方法(-o)
-oオプションを付けると、I/Oを実行しているプロセスだけを表示します。
事前準備(stressを使ってI/O負荷をかけます)
stressコマンドを実行して、ディスクアクセス負荷をかける。
[root@admin ~]# stress -d 3 --hdd-bytes 128M -q &
[1] 4263
stressのプロセスを確認する。
●が親プロセス、★が子プロセスです。ディスクアクセスするのは子プロセスです。
親はwaitシステムコールを実行して、子プロセスの終了を待っています。
[root@admin ~]# ps -LC stress -o comm,pid,ppid
COMMAND PID PPID
stress ●4263 1060
stress ★4264 4263
stress ★4265 4263
stress ★4266 4263
iotop実行結果確認
-oを指定して、I/Oを実行しているプロセスだけを表示します。
最初はI/O完了待ち時間の割合が0%(●印)ですが、
その後、70%-90%程度(★印)までI/O完了待ち時間の割合が増えているのがわかります。
[root@admin ~]# iotop -b -o
-中略-
Total DISK READ : 0.00 B/s | Total DISK WRITE : 133.91 M/s
Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 57.75 M/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
25 be/4 root 0.00 B/s 0.00 B/s 0.00 % 1.98 % [kworker/0:1]
4264 be/4 root 0.00 B/s 15.14 M/s 0.00 % ●0.00 % stress -d 3 --hdd-bytes 128M -q
4265 be/4 root 0.00 B/s 21.59 M/s 0.00 % ●0.00 % stress -d 3 --hdd-bytes 128M -q
4266 be/4 root 0.00 B/s 43.46 M/s 0.00 % ●0.00 % stress -d 3 --hdd-bytes 128M -q
Total DISK READ : 0.00 B/s | Total DISK WRITE : 118.80 M/s
Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 88.65 M/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
4143 be/4 root 0.00 B/s 0.00 B/s 0.00 % 84.19 % [kworker/u256:0]
4266 be/4 root 0.00 B/s 49.35 M/s 0.00 % ★82.29 % stress -d 3 --hdd-bytes 128M -q
4264 be/4 root 0.00 B/s 41.01 M/s 0.00 % ★80.61 % stress -d 3 --hdd-bytes 128M -q
4265 be/4 root 0.00 B/s 24.16 M/s 0.00 % ★67.03 % stress -d 3 --hdd-bytes 128M -q
Total DISK READ : 0.00 B/s | Total DISK WRITE : 57.54 M/s
Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 51.99 M/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
4265 be/4 root 0.00 B/s 21.93 M/s 0.00 % ★94.79 % stress -d 3 --hdd-bytes 128M -q
4264 be/4 root 0.00 B/s 21.93 M/s 0.00 % ★91.80 % stress -d 3 --hdd-bytes 128M -q
4143 be/4 root 0.00 B/s 0.00 B/s 0.00 % 83.38 % [kworker/u256:0]
4266 be/4 root 0.00 B/s 0.00 B/s 0.00 % ★71.49 % stress -d 3 --hdd-bytes 128M -q
-以下、略-
6.4 指定したプロセスのI/Oだけを表示する方法(-p <PID
>)
指定するプロセス数が1つの場合
[root@admin ~]# stress -d 1 --hdd-bytes 128M -q &
[1] 4333
stressプロセスを確認する。
●が親プロセス、★が子プロセスです。ディスクアクセスするのは子プロセスです。
stressコマンドには、子プロセスのPIDを指定します。
[root@admin ~]# ps -LC stress -o comm,pid,ppid
COMMAND PID PPID
stress ●4333 1060
stress ★4334 4333
iotopコマンドを実行する。PID=4334のプロセス(★)だけのI/Oの様子が表示されていることがわかる。
[root@admin ~]# iotop -b -p 4334
-中略-
Total DISK READ : 0.00 B/s | Total DISK WRITE : 69.23 M/s
Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 71.60 M/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
★4334 be/4 root 0.00 B/s 13.54 M/s 0.00 % 0.00 % stress -d 1 --hdd-bytes 128M -q
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
★4334 be/4 root 0.00 B/s 0.00 B/s 0.00 % 99.99 % stress -d 1 --hdd-bytes 128M -q
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
★4334 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % stress -d 1 --hdd-bytes 128M -q
Total DISK READ : 0.00 B/s | Total DISK WRITE : 127.60 M/s
Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 71.78 M/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
4334 be/4 root 0.00 B/s 71.78 M/s 0.00 % 99.99 % stress -d 1 --hdd-bytes 128M -q
指定するプロセス数が2つ以上の場合
ハードディスクアクセスをするstressプロセスを2つ起動する。
[root@admin ~]# stress -d 2 --hdd-bytes 10M -q &
[1] 1112
ハードディスクへの書き込む負荷を上げるのは、子プロセス(★印)。
親プロセスは子プロセスの終了をまってwaitシステムコールを実行しています。
[root@admin ~]# ps -LC stress -o comm,pid,ppid
COMMAND PID PPID
stress ●1112 760
stress ★1113 1112
stress ★1114 1112
2つの子プロセスのPIDを指定して、iotopコマンドを実行する。
[root@admin ~]# iotop -b -p 1113 -p 1114
Total DISK READ : 0.00 B/s | Total DISK WRITE : 527.44 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
★1113 be/4 root 0.00 B/s 527.44 M/s ?unavailable? stress -d 2 --hdd-bytes 10M -q
★1114 be/4 root 0.00 B/s 0.00 B/s ?unavailable? stress -d 2 --hdd-bytes 10M -q
6.5 指定したユーザのI/Oだけを表示する方法(-u <USER
>)
polkitdプロセスのユーザ名(USER)を確認する。ユーザ名はpolkitdであることがわかる。
[root@admin ~]# ps -LC polkitd -o comm,user,pid,ppid
COMMAND USER PID PPID
polkitd polkitd 507 1
gmain polkitd 507 1
gdbus polkitd 507 1
JS GC Helper polkitd 507 1
JS Sour~ Thread polkitd 507 1
runaway-killer- polkitd 507 1
ユーザ名を指定してiotopコマンドを実行する。ユーザ名がpolkitdのプロセスのI/Oの状況が確認できる。
[root@admin ~]# iotop -b -u polkitd
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
545 be/4 polkitd 0.00 B/s 0.00 B/s 0.00 % 0.00 % polkitd --no-debug [JS GC Helper]
546 be/4 polkitd 0.00 B/s 0.00 B/s 0.00 % 0.00 % polkitd --no-debug [JS Sour~ Thread]
547 be/4 polkitd 0.00 B/s 0.00 B/s 0.00 % 0.00 % polkitd --no-debug [runaway-killer-]
507 be/4 polkitd 0.00 B/s 0.00 B/s 0.00 % 0.00 % polkitd --no-debug
541 be/4 polkitd 0.00 B/s 0.00 B/s 0.00 % 0.00 % polkitd --no-debug [gmain]
542 be/4 polkitd 0.00 B/s 0.00 B/s 0.00 % 0.00 % polkitd --no-debug [gdbus]
6.6 バッチモードで収集したログをファイルに保存する方法(リダイレクトを使う)
systemd(PID=1)のI/Oの状況を5秒間隔でファイルに保存する方法を以下に示します。
[root@admin ~]# iotop -b -p 1 -t -d 5 > iotop.txt
[root@admin ~]# cat iotop.txt
21:23:11 Total DISK READ : 0.00 B/s | Total DISK WRITE : 0.00 B/s
21:23:11 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
21:23:11 1 rt/2 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % systemd --switched-root --system --deserialize 21
21:23:16 Total DISK READ : 0.00 B/s | Total DISK WRITE : 0.00 B/s
21:23:16 Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 613.35 B/s
TIME TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND
21:23:16 1 rt/2 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % systemd --switched-root --system --deserialize 21
21:23:21 Total DISK READ : 0.00 B/s | Total DISK WRITE : 0.00 B/s
21:23:21 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
21:23:21 1 rt/2 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % systemd --switched-root --system --deserialize 21
-以下、略-
6.7 iotopの実行回数を指定する方法(-n)
実行結果を2回(-n 2)表示したらiotopコマンドを終了する。
[root@admin ~]# 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 rt/2 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % systemd --switched-root --system --deserialize 21
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 rt/2 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % systemd --switched-root --system --deserialize 21