Help us understand the problem. What is going on with this article?

iotopコマンドの使い方

More than 1 year has passed since last update.

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

iotop.png

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
hana_shin
写真は淡路島SAから明石海峡大橋を撮影したものです('19夏撮影)。'20年夏も3年連続で四国、大阪に行く予定でしたが、コロナ終息しないので断念。甲子園で高校野球もみれない。ほんと悲しい!コロナなんとかならないか!治療薬の研究開発している人がんばってほしいな。ソフトが少しでも役に立てればと思う今日この頃。取得済資格:ネットワークスペシャリスト、オンライン情報処理技術者。
https://hana-shin.hatenablog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away