服务器IO性能排查——iostat

avatar
作者
猴君
阅读量:0

iostat 是sysstat命令集下的在 Linux 和 UNIX 系统上用于监控系统输入/输出设备负载的工具,它提供了 CPU 和输入/输出(I/O)使用情况的统计信息。

用法

iostat [选项] [间隔时间] [次数]

选项内容

  • -c:仅显示 CPU 使用情况。
  • -d:仅显示磁盘 I/O 统计信息。
  • -k 或 -K:显示报告的单位为 1024 字节的倍数(默认为 512 字节的倍数)。
  • -m 或 -M:以兆字节(MB)为单位显示报告。
  • -N:显示所有网络接口的状态。
  • -P:显示每个处理器的 CPU 使用情况。
  • -R:仅报告与 CPU 相关的统计信息,不包括 I/O。
  • -x:提供扩展的磁盘 I/O 统计信息,包括每个磁盘的详细统计数据。
  • -y:在第一次报告后,提供上一个采样期间的统计信息,而不是从开始到现在的统计信息。

间隔和次数

  • iostat可以用于查看实时的情况,这里的间隔和次数就代表了多久统计一次,共统计几次

    例如:iostat 2 2 则表示每两秒输出一次实时IO情况,输出两次

常用命令格式

iostat 主要用于监控服务器上IO情况以及CPU对于IO操作时的情况,常见:

# 查看IO的整体情况(每隔1秒输出一次,持续输出) iostat -x 1
# 查看IO的整体情况(每隔2秒输出一次,输出5次) iostat -x  2 5
# 查看IO的整体情况(单位换算为MB,每隔2秒输出一次,输出5次) iostat -x -m 2 5

输出分析

单纯使用 iostat 1 2,每隔1秒统计一次,输出两次,输出如下:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle            3.01    0.25    2.50    0.00    0.00   94.24  Device:         tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn sda            0.03         0.02         0.01     13096       5120 sdb            1.01        12.50        50.25    626304    2510400 sdc            0.00         0.00         0.00        0         0

需要存储设备详细内容的 iostat -x 1 2 ,每隔1秒统计一次,输出两次 , 输出如下:

Linux 4.19.0-12-amd64 (hostname)  2024年05月30日 17:10:10  avg-cpu:  %user   %nice %system %iowait  %steal   %idle            0.00    0.10    0.45    0.00    0.00   99.45  Device:            rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz await r_await w_await  %util sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00 sdb               0.00     2.00  110.00  130.00  266.67  559.67    8.00     0.01    1.98    0.43    2.51   1.20 sdc               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00  17:10:11  avg-cpu:  %user   %nice %system %iowait  %steal   %idle            0.50    0.00    0.25    0.00    0.00   99.25  Device:            rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz await r_await w_await  %util sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00 sdb               0.00     2.00  120.00  140.00  293.33  614.67    8.92     0.02    2.11    0.47    2.64   1.35 sdc               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00

说明一点,一般iostat命令输出的第一组数据是系统自开机以来的一个总累计结果,所以定位问题时,需要跳过第一组输出,第二组输出开始才是实时的情况

可以看到,在不使用-d 参数情况下, 输出都是包含两部分:CUP的信息和存储设备的信息(总览/详细 -d),先看CPU信息部分:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle            0.00    0.10    0.45    0.00    0.00   99.45
  • %user:用户进程CPU所花费的时间 ,大多数场景应该< 60%

  • %nice:修改过优先级的进程占用CPU时间(参考场景价值较少,可忽略)

  • %system:系统(内核)进程使用CPU的时间,多数场景下,此参数+%user应该 < 80%

  • %iowait:IO等待所占用CPU时间(重要),一般情况<30%算正常情况(特殊功能服务器单算)

  • %steal:丢失时间占用CPU

  • %idle:CPU处于空闲状态时间,赶紧的系统一般维持在90%多

此部分其实主要参考%iowait%idle 两个参数,一般情况下,%user+%system是低于80%的,如果%idle 在周期内持续游走在20%以下,说明CPU在80%的时间都是繁忙的,问题可能出现在CPU的性能层面;而%iowait较高而 %idle 高于 70% ,说明我的CPU十分清闲,但是等待IO的时间非常多,则说明瓶颈出现在IO上

再看存储设备的信息部分,在不使用 -x 参数,单纯的iostat命令是看存储设备的整体情况:

# 不携带 -x 参数,仅输出存储设备整体的情况 Device:         tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn sda            0.03         0.02         0.01     13096      
  • Device:磁盘设备名称(参数加上-N可直接翻译出存储设备对应的名称)
  • tps:设备每秒接受的IO传输请求,读或写都包含在内(即1秒内磁盘进行多少次IO读写)。
  • kB_read/s:设备每秒读取的数据量(加 -m 可以转为MB)
  • kB_wrtn/s:设备每秒写入的数据量(加 -m 可以转为MB)
  • kB_read:自系统启动以来从磁盘读取的总数据量(加 -m 可以转为MB)
  • kB_wrtn:自系统启动以来写入磁盘的总数据量(加 -m 可以转为MB)

一般这部分输出的作用就是能快速对此系统的IO有个总的印象, 不同的存储设备驱动器情况不一样,我们可以根据这个实时的运转的情况和相应的驱动器类型下的理论值范围对比,或者计算一下当前存储设备的每秒IO吞吐量,作为后续的分析依据:

每秒I/O吞吐量 = TPS × 每秒I/O传输大小(由程序决定,不确定)

实际场景中,使用的更多是加 -x 参数来查看存储设备详情的内容:

# 携带 -x 参数,输出存储设备详细情况 Device:            rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz await r_await w_await  %util sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00 sdb               0.00     2.00  120.00  140.00  293.33  614.67    8.92     0.02    2.11    0.47    2.64   1.35
  • rrqm/swrqm/s:每秒合并的读/写请求的平均数量
  • r/sw/s:每秒完成的读写IO设备次数,tps 实际上就是 r/s  w/s` 的总和
  • rMB/swMB/s :每秒读取、写入的兆字节数
  • avgrq-sz:平均I/O数据大小,即每次IO平均读取/写入多数数据
  • avgqu-sz:磁盘请求队列的平均长度,单位时间里平均排队等待的IO请求数
  • await:平均每次 I/O 请求的等待时间(毫秒)
  • r_awaitw_await:平均每次读请求的等待时间(毫秒)
  • svctm:平均每次 I/O 请求的服务时间(毫秒)
  • %util:I/O利用率百分比(设备非空闲率)

分析中需要着重注意的内容包括:r/sw/savgrq-szavgqu-szr_awaitw_awaitawait%util。而这堆参数中,我们主要关注的就是一次IO请求的等待时间,也就是 await,await表示我进行一次IO的操作需要多长时间(包括等待的时间,操作的时间),一些版本awaitd_wait替代或者没有,如果没有此参数,可以根据实际场景,参考 r_awaitw_await ; await的阈值根据设备不同也不相同,一般固态硬盘大约在1ms左右,如果服务器采用的是固态硬盘,而此时await又超出太多,那么就说明存在问题(IO瓶颈);机械硬盘rpm为10000转的,大约在8.38ms左右,计算方式如下:

await = 寻道延迟 + 旋转延迟 + 传输延迟

详细计算方式:http://cseweb.ucsd.edu/classes/wi01/cse102/sol2.pdf

a_await之外,就是 %util ,%util 表示的是设备工作时间占全部时间的比重,也就是不空闲的频率,由于IO设备有多个处理窗口,具有并行处理能力,所以即使该设备的不空闲率高达100%,也只是理论值,并不一定是IO处理饱和了。

配合pidstat进行问题定位

pidstat 也是 sysstat 集中的一个命令行工具,聚焦于进程的角度去提供 CPU、内存、I/O 和上下文切换等统计数据,搭配iostat 多是用于聚焦于具体进程的IO部分的统计

同iostat 用法差不多,pidstat的用法为:

pidstat [选项] [间隔时间] [次数]

参数主要有:

  • -u:显示 CPU 使用情况。
  • -r:显示内存使用情况。
  • -d:显示 I/O 统计信息。
  • -p <pid>:指定进程 ID 的统计信息。

这里作为聚焦进程的IO辅助,主要是使用 -d-p 两个参数

# 查看pid为3448721 进程的IO情况 pidstat -d -p 3448721 #输出 inux 4.19.0-12-amd64 (hostname)  2024年05月30日 17:10:10  PID       dsk/s   rqmq/s   qui/s    merg/s   rd_sector/s  wr_sector/s  avgrq-sz  avgqu-sz  await  r_await w_await  svctm  %util 3448721    0.0     0.0      0.0      0.0      0.0         0.0          0.0       0.0      0.00   0.00    0.00    0.00   0.00   0.00  17:10:11  PID       dsk/s   rqmq/s   qui/s    merg/s   rd_sector/s  wr_sector/s  avgrq-sz  avgqu-sz  await  r_await w_await  svctm  %util 3448721    2.0     0.3      0.1      2.0      960.0        1920.0       8.0       0.1      2.56   1.23    1.33    1.00   0.80   1.23  17:10:12  PID       dsk/s   rqmq/s   qui/s    merg/s   rd_sector/s  wr_sector/s  avgrq-sz  avgqu-sz  await  r_await w_await  svctm  %util 3448721    1.0     0.2      0.0      1.0      480.0        240.0        4.0       0.0      1.23   0.50    0.75    0.40   0.30   0.60

配合iostat的分析方法,可以定位到具体进程上发现问题。

部分老版本可能出现:

Linux 4.19.0-12-amd64 (hostname)  2024年05月30日 17:10:10  UID      PID kB_rd/s kB_wr/s kB_ccwr/s iodelay  Command root      1000   100.00    50.00      0.00      0.5      my_daemon root      2000    10.00   120.00      0.00      0.3      my_service root      3000     1.00     5.00      0.00      0.1      cron
  • UID:运行进程的用户 ID。
  • PID:进程的 ID。
  • kB_rd/s:每秒从磁盘读取的千字节数,这个指标显示了进程在单位时间内从磁盘读取的数据量。
  • kB_wr/s:每秒写入磁盘的千字节数,这个指标显示了进程在单位时间内向磁盘写入的数据量。
  • kB_ccwr/s:任务取消的写入磁盘的千字节数,当任务截断脏的 page cache 时会发生这种情况。
  • iodelay:I/O 延迟百分比。这个指标显示了进程等待 I/O 操作完成的时间占总 CPU 使用时间的百分比,反映了 I/O 操作的延迟情况。
  • Command:正在运行的进程的命令名称或启

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!