如何监控Linux系统中的磁盘IO
1.概述
在本教程中,我们将讨论如何监控Linux系统中的磁盘I/O活动。这是在维护系统时要执行的一项重要任务。从本质上讲,从磁盘上取回数据需要花费时间。因此,磁盘I/O子系统被认为是最慢的部分,会拖累整个系统。
因此,检查磁盘性能是很重要的。我们需要查看是否存在瓶颈,以及造成瓶颈的原因,并确定哪个进程在等待I/O请求的完成。为此,我们将学习如何使用iostat、iotop、sar和vmstat等工具来检查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命令按进程检查磁盘读写活动。