I/O 等待时间是一种用于衡量CPU等待磁盘 I/O 操作完成的时间的指标。高 I/O 等待时间表示CPU繁忙或者有大量未完成的 I/O 请求,虽然可能不会使系统出现问题,但会限制CPU性能。
CPU的 I/O 等待意味着即使没有进程处于可运行状态,但至少有一个 I/O 操作正在进行中。简单地说,I/O 等待时间就是 CPU 等待 I/O 完成所花费的时间。
I/O 等待只是指示CPU或CPU核心的状态。高 I/O 等待意味着CPU正在处理请求,但需要进一步调查以确认原因和影响。
以下是 I/O 等待时间高的几个可能原因:
高 I/O 等待迫使服务器处理更高的带宽,以便在等待IO请求时执行其他计算。 I/O 等待是分析系统性能的常见指标。当频繁发生高 I/O 等待时,它可能会减慢系统速度或导致数据库事务吞吐量低以及应用程序和数据库的健康退化等问题,从而对系统性能产生负面影响。
Linux中最常用于识别和排除 I/O 等待时间的两个命令是 top
和 vmstat
。这些命令将显示各种CPU级别的统计数据,包括 I/O 等待时间。
Top命令是在Linux中识别I/O等待时间的最简单、使用最广泛的命令。它显示系统的动态和实时视图、CPU级别的统计信息以及由内核管理的进程的运行列表。
使用方法为:
top [options]
命令输出为:
top - 20:24:04 up 115 days, 9:00, 12 users, load average: 5.73, 6.39, 6.68
Tasks: 1032 total, 2 running, 1028 sleeping, 1 stopped, 1 zombie
%Cpu(s): 9.6 us, 2.5 sy, 1.1 ni, 86.5 id, 0.0 wa, 0.0 hi, 0.4 si, 0.0 st
MiB Mem : 64203.2 total, 46324.7 free, 11732.5 used, 6146.0 buff/cache
MiB Swap: 1512.8 total, 97.7 free, 1415.1 used. 51154.0 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
271591 test 21 1 10.0g 236668 53752 S 249.5 0.4 151797:09 gnome-shell
813302 test 20 0 5776436 654144 269008 S 105.6 1.0 69702:44 firefox
我们将重点关注 %Cpu(s)
这一行行。除了其他重要的统计信息外,它还显示I/O等待时间。I/O等待时间由%Cpu(s)行中的wa标签表示。
wa
表示CPU等待 I/O 完成的时间百分比。如果您在多核处理器系统上,您可以在顶部命令运行时按数字 1,以获取每个CPU的CPU使用率明细。
Vmstat命令是Linux提供的另一个性能监视工具。它提供有关内存、进程、CPU等的信息。缺省情况下,vmstat显示自系统上次重新引导以来的统计信息。它还可以显示在指定间隔后更新的实时统计信息。
使用方法为:
vmstat [options][delay [count]]
Vmstat命令通常使用的两个参数是:
命令输出为:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
3 0 1449100 45796068 2936 6298992 0 0 25 133 0 0 8 2 90 0 0
vmstat命令的输出输出分为四个部分, 我们将重点介绍CPU部分。此部分中的列类似于top命令的%Cpu(s)行。除了I/O等待时间(wa)之外,我们还通过vmstat命令获得了一些额外的信息,例如总的空闲内存或交换到I/O和从I/O交换的数据块的数量。 例如,拥有较少的空闲内存可能会导致较高的I/O等待时间。
一旦您确认您确认操作系统中存在较高的I/O等待时间,下一步应该是找到负责这些I/O操作进程。最简单、最常用的命令之一是iotop。
iotop命令与顶部命令相同,因为它用于监控磁盘I/O使用情况以及负责它的进程或线程的运行列表。它基于Python,通过访问内核来监控进程的I/O。
使用方法为:
iotop [options]
命令输出为:
Total DISK READ: 0.00 B/s | Total DISK WRITE: 227.20 K/s
Current DISK READ: 0.00 B/s | Current DISK WRITE: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
272078 be/4 test 0.00 B/s 16.74 K/s 0.00 % 0.00 % VBoxSVC --auto-shutdown [nspr-2]
第一行包含磁盘的总读写带宽。下一行显示当前进行I/O的进程或线程完成的读写操作的实际带宽。
Total DISK READ 和 Total DISK WRITE 的值一方面表示了进程和内核线程之间的总的读写带宽,另一方面也表示内核块设备子系统的。
Actual DISK READ 和 Actual DISK WRITE 的值表示在内核块设备子系统和下面硬件(HDD、SSD 等等)对应的实际磁盘 I/O 带宽。
剩下的部分显示进程的运行列表,其中包该进程对当前磁盘I/O使用情况的数据
这里最重要的列是I/O列,它显示进程执行I/O的时间占其总处理时间的百分比。
该列表时以倒序的方式排列,排在前面的为 I/O 繁忙的进程
此命令最常用的选项之一是 -o
或 -only
。与命令(iotop -o)一起运行,它将结果缩小到实际执行I/O的进程的运行列表。
top 和 vmstat 命令告诉我们I/O等待时间,iotop命令帮助我们识别执行I/O操作的进程。另一个需要考虑的重要因素是这些操作中使用的磁盘。Iostat命令提供此信息。
iostat 命令显示系统的输入/输出统计信息。它通过监控与平均传输速率相关的活动时间段来生成设备级报告。与top和vmstat命令一样,iostat也显示CPU统计信息。
使用方法为:
iostat [option] [interval] [count]
这里的 interval 和 count 参数类似于vmstat命令的参数,它们用于一直运行新或仅统计特定次数后退出。
Linux 5.4.0-153-generic (desktop) 11/10/2023 _x86_64_ (48 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
7.82 0.23 2.34 0.02 0.00 89.60
Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd
dm-0 1.74 46.08 12.25 18.36 459270779 122131754 182992676
dm-1 139.85 1068.35 5992.31 346.79 10648319090 59725961567 3456525544
上面的第一行显示平均CPU统计信息,包括I/O等待时间。它表示与top和vmstat命令中的WA值相同的值。
剩下的部分提供所有设备和分区的读写数据:
在我们确定了高I/O等待时间背后的进程和涉及的磁盘之后,我们可以使用多种方法进行修复。以下是将高I/O等待时间最小化的一些最常用方法:
在对Linux中的高I/O等待进行故障排除时,重要的是首先了解根本原因。然后,top和vmstat命令可以帮助诊断高I/O等待时间,而iotop和iostat可以通过识别导致高I/O等待时间的进程和磁盘来帮助进行故障排除。处理高I/O等待时间用到的方法,具体取决于实际的原因。专注于最大限度地减少I/O等待–I/O等待时间越短,系统的性能就越好。