hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

iotopコマンドの使い方



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