如何解决Linux中的高 I/O 等待时间

I/O 等待时间是一种用于衡量CPU等待磁盘 I/O 操作完成的时间的指标。高 I/O 等待时间表示CPU繁忙或者有大量未完成的 I/O 请求,虽然可能不会使系统出现问题,但会限制CPU性能。
CPU的 I/O 等待意味着即使没有进程处于可运行状态,但至少有一个 I/O 操作正在进行中。简单地说,I/O 等待时间就是 CPU 等待 I/O 完成所花费的时间。

什么会导致 I/O 等待时间增大

I/O 等待只是指示CPU或CPU核心的状态。高 I/O 等待意味着CPU正在处理请求,但需要进一步调查以确认原因和影响。
以下是 I/O 等待时间高的几个可能原因:

  • 存储层中的瓶颈导致驱动器需要更多时间来响应 I/O 请求
  • 存储层中的 I/O 请求队列导致延迟增加
  • 数据块设备(如物理磁盘)速度太慢或已满负荷
  • 处于不可中断休眠状态的进程
  • 对磁盘执行繁重读和写操作的进程
  • 操作系统上因RAM短缺而使用了swap分区
  • 磁盘和网络 I/O 操作,这是系统速度缓慢的最常见原因
  • 速度慢的磁盘或降级的RAID阵列,延迟访问内存以进行读写操作

I/O 等待会影响您的系统性能吗?

高 I/O 等待迫使服务器处理更高的带宽,以便在等待IO请求时执行其他计算。 I/O 等待是分析系统性能的常见指标。当频繁发生高 I/O 等待时,它可能会减慢系统速度或导致数据库事务吞吐量低以及应用程序和数据库的健康退化等问题,从而对系统性能产生负面影响。

诊断Linux中的 I/O 等待时间

Linux中最常用于识别和排除 I/O 等待时间的两个命令是 topvmstat。这些命令将显示各种CPU级别的统计数据,包括 I/O 等待时间。

使用 top 命令

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 命令

Vmstat命令是Linux提供的另一个性能监视工具。它提供有关内存、进程、CPU等的信息。缺省情况下,vmstat显示自系统上次重新引导以来的统计信息。它还可以显示在指定间隔后更新的实时统计信息。

使用方法为:

vmstat [options][delay [count]]

Vmstat命令通常使用的两个参数是:

  • delay:此参数用于在指定的延迟(以秒为单位)后持续更新报告。
  • count:该参数用于定义需要更新的次数。缺省值为无穷大。

命令输出为:

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等待时间,下一步应该是找到负责这些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的进程的运行列表。

识别 I/O 写入到哪个磁盘

top 和 vmstat 命令告诉我们I/O等待时间,iotop命令帮助我们识别执行I/O操作的进程。另一个需要考虑的重要因素是这些操作中使用的磁盘。Iostat命令提供此信息。

使用 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值相同的值。
剩下的部分提供所有设备和分区的读写数据:

  • Device: 分区或设备的名字
  • tps: 每秒传输。过载或繁忙的处理器将始终具有更高的tps。
  • Blk_read/s (kB_read/s): 每秒从设备读取的数据块数量
  • Blk_wrtn/s (kB_wrtn/s): 每秒写入设备读的数据块数量
  • Blk_read (kB_read): 启动后从设备读取的数据块数量
  • Blk_wrtn (kB_wrtn): 启动后写入设备读的数据块数量

在我们确定了高I/O等待时间背后的进程和涉及的磁盘之后,我们可以使用多种方法进行修复。以下是将高I/O等待时间最小化的一些最常用方法:

  • 通过减少数据库查询等I/O操作来降低磁盘读写频率。
  • 确保操作系统更新到最新版本,并安装了所有补丁,以便减少操作系统中的错误导致的任何I/O等待。
  • 升级服务器中的硬盘和RAM,安装RPM较高的磁盘或I/OPS较高的SSD。
  • 如果CPU用户时间过高,请尝试终止该进程。
  • 检查swap的使用情况——高频率使用swap意味着系统实际上没有足够的RAM。在这种情况下,增加RAM可能会减少I/O等待时间。
  • 检查是否有任何潜在的内存泄漏。一些应用程序可能会消耗内存,而不是在使用后释放内存。这可能会导致内存泄漏,最终导致较长的I/O等待时间。

结论

在对Linux中的高I/O等待进行故障排除时,重要的是首先了解根本原因。然后,top和vmstat命令可以帮助诊断高I/O等待时间,而iotop和iostat可以通过识别导致高I/O等待时间的进程和磁盘来帮助进行故障排除。处理高I/O等待时间用到的方法,具体取决于实际的原因。专注于最大限度地减少I/O等待–I/O等待时间越短,系统的性能就越好。

你可能感兴趣的:(linux,服务器,运维)