1. 概要

このチュートリアルでは、LinuxシステムでディスクI/Oアクティビティを監視する方法について説明します。 システムを維持しながら実行することは重要なタスクです。 基本的に、ディスクからデータを取り戻すには時間がかかります。 その結果、ディスクI / Oサブシステムは最も遅い部分と見なされ、システム全体の速度を低下させる可能性があります。

したがって、ディスクのパフォーマンスを確認することが重要です。 ボトルネックがあるかどうかとその原因を確認し、I/O要求の終了を待機しているプロセスを特定する必要があります。 この目的のために、 iostat iotop、 sar vmstatなどのツールを使用してディスクをチェックする方法を学習します。 Linuxシステムでの/Oパフォーマンス。

2. ツールをインストールする

始める前に、ツールがまだ利用できない場合は、Linuxシステムにツールをインストールする必要があります。 ツールiostat、vmstat、、および sar は、sysstatパッケージの一部です。 iotop ツールは、iotopパッケージの一部です。

Debian、Ubuntu、またはその他の派生物にインストールするには、次のコマンドを実行します。

$ sudo apt-get install sysstat
$ sudo apt-get install iotop

RHLE、CentOS、およびFedoraの場合、以下を実行します。

$ sudo dnf install sysstat
$ sudo dnf install iotop

3. ディスクI/O統計のレポート

まず、ディスクI/Oアクティビティの概要を把握するのは興味深いことです。 この場合、iostatコマンドは便利で理解しやすいです。 入出力統計の略です。 CPUとディスクデバイスの使用率に関する情報を報告します。

現時点では、ディスクI/Oアクティビティのみに焦点を当てます。 したがって、-dオプションを使用します。

$ iostat -d 
Linux 5.13.12-100.fc33.x86_64 (dhcppc5) 	08/30/2021 	_x86_64_	(4 CPU)

Device             tps    kB_read/s    kB_wrtn/s    kB_dscd/s    kB_read    kB_wrtn    kB_dscd
dm-0              4.84        48.24        35.44         0.00   15064145   11067448          0
dm-1              1.00         1.41         2.60         0.00     440364     812036          0
dm-2              0.18         5.59         0.01         0.00    1747005       2788          0
dm-3              0.08         8.02         0.58         0.00    2503710     180532          0
dm-4              0.00         0.00         0.00         0.00       1272          0          0
dm-5              0.08         8.02         0.58         0.00    2503421     181956          0
sda               3.14        63.31        38.14         0.00   19772796   11911070          0
scd0              0.00         0.00         0.00         0.00          1          0          0
zram0             7.74         9.36        21.58         0.00    2924188    6738944          0

iostat コマンドを繰り返すために、秒単位で間隔を追加できます。

$ iostat -d 2

ご覧のとおり、 iostat は、システムに存在するすべてのデバイスアクティビティに関する情報を表示します。 -p オプションを追加して、ブロックデバイスとそのすべてのパーティションの統計を表示することもできます。

$ iostat -d -p sda
Device             tps    kB_read/s    kB_wrtn/s    kB_dscd/s    kB_read    kB_wrtn    kB_dscd
sda               4.11        78.09        47.02         0.00   77566501   46701318          0
sda1              0.00         0.01         0.00         0.00       8432          6          0
sda2              4.10        78.08        47.02         0.00   77550214   46701280          0
sda3              0.00         0.01         0.00         0.00       5168         32          0

デフォルトでは、 iostat コマンドは、システムに存在するすべてのブロックデバイスとパーティションに関する情報を表示します。 メトリックがゼロのデバイスをスキップして、実際にアクティブなディスクまたはパーティションに関する情報のみを出力する場合は、-zオプションを追加できます。

$ iostat -d -z 2
Device             tps    kB_read/s    kB_wrtn/s    kB_dscd/s    kB_read    kB_wrtn    kB_dscd
dm-0              0.50         2.00         0.00         0.00          4          0          0
sda               0.50         2.00         0.00         0.00          4          0          0
zram0             2.50        10.00         0.00         0.00         20          0          0
Device             tps    kB_read/s    kB_wrtn/s    kB_dscd/s    kB_read    kB_wrtn    kB_dscd
dm-0             22.50         0.00       152.00         0.00          0        304          0
dm-3              0.50        64.00         0.00         0.00        128          0          0
dm-5              0.50        64.00         0.00         0.00        128          0          0
sda              16.00        64.00       148.00         0.00        128        296          0
zram0             0.50         2.00         0.00         0.00          4          0          0

4. ボトルネックの背後にあるプロセスを特定する

I / Oアクティビティを確認する方法については前に説明しましたが、それだけでは不十分な場合があります。 たとえば、どのプロセスまたはスレッドが大量のI/Oアクティビティを引き起こしているのかを特定することが重要です iotop コマンドは、まさにそれを行うのに役立ちます。 これは、プロセスまたはスレッドごとにリアルタイムのディスクアクティビティを提供するインタラクティブなツールです。 iotopにはroot特権またはNET_ADMIN機能が必要であることに注意してください。

また、次のカーネルオプションが有効になっているかどうかを確認する必要があります。

$ egrep '(CONFIG_VM_EVENT_COUNTERS|TASK_IO_ACCOUNTING|CONFIG_TASKSTATS|TASK_DELAY_ACCT)' /boot/config-$(uname -r)
CONFIG_TASKSTATS=y
CONFIG_TASK_DELAY_ACCT=y
CONFIG_TASK_IO_ACCOUNTING=y
CONFIG_VM_EVENT_COUNTERS=y

デフォルトでは、iotopコマンドは各プロセスまたはスレッドごとのディスクI /Oのビューを表示します

$ sudo iotop
Total DISK READ :      18.27 K/s | Total DISK WRITE :       0.00 B/s
0.00 B DISK READ:      18.27 K/s | Actual DISK WRITE:      14.61 K/s
    TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                                                                                
    509 be/3 root        0.00 B/s    0.00 B/s  0.00 %  3.91 % [jbd2/dm-0-8]
 247269 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.21 % [kworker/0:2-events]
   2507 be/4 nwd        18.27 K/s    0.00 B/s  3.57 %  0.00 % gnome-terminal-server
      1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % systemd --switched-root --system --deserialize 30
      2 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kthreadd]
      3 be/0 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [rcu_gp]
      4 be/0 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [rcu_par_gp]
      6 be/0 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kworker/0:0H-events_highpri]
      9 be/0 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [mm_percpu_wq]
     10 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [rcu_tasks_kthre]
     11 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [rcu_tasks_rude_]
     12 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [rcu_tasks_trace]
     13 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/0]
     14 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [rcu_sched]

-o オプションを使用して、実際にI/Oアクティビティを実行しているプロセスまたはスレッドのみを表示できます。

$ sudo iotop -o 
Total DISK READ :    1864.38 K/s | Total DISK WRITE :       0.00 B/s
10.34l DISK READ:    1875.65 K/s | Actual DISK WRITE:       0.00 B/s
    TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                                                                                
 245778 be/4 nwd       608.93 K/s    0.00 B/s 62.08 % 34.04 % firefox -contentproc -childID 3 -isForBrowser -prefs~46 -appdir /usr/lib64/firefox/browser 245562 true tab
   1822 be/4 nwd       105.25 K/s    0.00 B/s  0.00 % 14.13 % gnome-shell
   2507 be/4 nwd       139.08 K/s    0.00 B/s  0.00 %  1.48 % gnome-terminal-server
 245562 be/4 nwd       206.74 K/s    0.00 B/s 93.98 %  0.00 % firefox
 246053ble_ponwd ]      18.79 K/s    0.00 B/s 24.22 %  0.00 % firefox -contentproc -childID 5 -isForBrowser -prefs~sr/lib64/firefox/browser 245562 true tab [DOM Worker]
 247924 be/4 nwd       127.80 K/s    0.00 B/s 44.84 %  0.00 % vlc --started-from-file /home/nwd/Music/Mozart Allegro assai.mp4
 247956 be/4 nwd       657.79 K/s    0.00 B/s 38.89 %  0.00 % dd if=/dev/zero of=/tmp/test.img bs=1G oflag=dsync

-P オプションを追加して、スレッドのないプロセスのリストを表示できます。

$sudo iotop -oP

5. 一定期間にわたるディスクI/O統計の生成

以前、ディスクアクティビティをリアルタイムで監視する方法を学びましたが、1週間以上の履歴データを収集する必要がある場合があります。 目標は、分析に十分なデータを収集するか、将来の進化を計画することです。 これを行う最も簡単な方法は、sarコマンドを使用することです。

デフォルトでは、sarコマンドはすべてのシステムリソースを監視します。 この場合、関心があるのはディスクアクティビティのみです。 -b オプションを使用して、ディスクアクティビティに関する詳細を報告しましょう。

$ sar -b 1 
...
04:10:00 PM       tps      rtps      wtps      dtps   bread/s   bwrtn/s   bdscd/s
04:10:01 PM     12.00      0.00     12.00      0.00      0.00    176.00      0.00
04:10:02 PM     35.00     31.00      4.00      0.00   1272.00     80.00      0.00
04:10:03 PM      0.00      0.00      0.00      0.00      0.00      0.00      0.00
04:10:04 PM     73.00      0.00     73.00      0.00      0.00    648.00      0.00
04:10:05 PM      0.00      0.00      0.00      0.00      0.00      0.00      0.00
04:10:06 PM     22.00      0.00     22.00      0.00      0.00    192.00      0.00
04:10:07 PM      1.00      0.00      1.00      0.00      0.00      8.00      0.00
04:10:08 PM      4.00      0.00      4.00      0.00      0.00    112.00      0.00

-d オプションを使用して、各ブロックデバイスのアクティビティを報告できます。 -p オプションを使用して、デバイスを簡単に識別することもできます。

$ sar -p -d -b 1
04:26:15 PM       DEV       tps     rkB/s     wkB/s     dkB/s   areq-sz    aqu-sz     await     %util
04:26:16 PM       sda      2.00    128.00     52.00      0.00     90.00      0.00      0.50      0.40
04:26:16 PM       sr0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
04:26:16 PM   lv-root      1.00      0.00     52.00      0.00     52.00      0.00      1.00      0.20
04:26:16 PM   lv-swap      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
04:26:16 PM     zram0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
04:26:16 PM   lv-home      1.00    128.00      0.00      0.00    128.00      0.00      1.00      0.20
...

sarコマンドの出力を-oオプションを使用してファイルに保存することができます。 ファイルはバイナリ形式であることに注意してください。

$ sar 2 5 -o /tmp/data_io > /dev/null 2>&1

次に、 -f オプションを使用して、ファイルに保存されているsarコマンドによって生成されたレポートを読み取ります。

$ sar -f /tmp/data_io

6. vmstatを使用してディスクI/O使用量を測定する

もう1つの便利なツールはvmstatで、システムで何が起こっているかを全体的に把握できます。 たとえば、 vmstat コマンドを使用して、プロセス、メモリ、およびCPUに関する情報を報告し、ディスクI/Oアクティビティを表示できます。

vmstatを使用してシステムからディスクI/O統計を取得するには、を呼び出します。

$ vmstat [-D] [-d] [-p partition] [interval [count]]

-d オプションを使用して、個々のディスク統計を表示します。

$ vmstat -d 1
isk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors      ms  total merged sectors      ms    cur    sec
sda   2659118 1531393 166084689 49623955 1725402 4672072 104580917 70770454      0  25194
sr0    24187     28 5886957 1315209      0      0       0       0      0    966
dm-0  2178560      0 114338954 50785360 3433060      0 81458000 79180110      0  21302
dm-1  1605211      0 12845592 24735782 2946339      0 23570712 947720915      0   5866
zram0 2609461      0 20875688   26812 4958733      0 39669864   57039      0    511
dm-2  312586      0 21187074 3814922   2852      0   49288   76928      0    674
dm-3   88452      0 17673344  640177   4957      0  526864  104362      0    537
...

次に、 -p オプションを導入して、パーティションに関する詳細なパフォーマンス統計を取得します。

$ vmstat -p /dev/sda2 1 
sda2            reads      read sectors      writes  requested writes
              2663617         166204812     1725915         104595152
              2663617         166204812     1725915         104595152
              2663617         166204812     1725915         104595152
              2663618         166205068     1725915         104595152
              2663618         166205068     1725917         104595216
...

7. 結論

この記事では、 iostat、vmstat、、およびsarコマンドを使用してディスクI/Oのパフォーマンスを確認する方法を学びました。 また、 iotop コマンドを使用して、プロセスごとにディスクの読み取りおよび書き込みアクティビティを確認する方法についても説明しました。