如何监控Linux系统中的磁盘IO

评论 0 浏览 0 2021-11-01

1.概述

在本教程中,我们将讨论如何监控Linux系统中的磁盘I/O活动。这是在维护系统时要执行的一项重要任务。从本质上讲,从磁盘上取回数据需要花费时间。因此,磁盘I/O子系统被认为是最慢的部分,会拖累整个系统。

因此,检查磁盘性能是很重要的。我们需要查看是否存在瓶颈,以及造成瓶颈的原因,并确定哪个进程在等待I/O请求的完成。为此,我们将学习如何使用iostatiotopsarvmstat等工具来检查Linux系统的磁盘I/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统计数据

我们之前学习了如何实时监控磁盘活动,但有些情况下我们需要收集一整周或更长时间的历史数据。目标是收集足够的数据用于分析或计划 未来的演变。最简单的方法是使用sar command来做这件事。

默认情况下,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
...

可以用o 选项将sar 命令的输出保存在一个文件中。请注意,该文件是二进制格式的。

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

现在,我们将使用-f 选项来读取文件中保存的sar命令所产生的报告。

$ sar -f /tmp/data_io

6.用vmstat测量磁盘I/O用量

另一个有用的工具是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命令按进程检查磁盘读写活动。

 

最后更新2023-01-21
0 个评论
标签