iostat介绍

iostat 命令是 I/O statistics(输入/输出统计)的缩写,用来报告系统的 CPU 统计信息和块设备及其分区的 IO 统计信息。iostat 是 sysstat 工具集的一个工具,在 Ubuntu 系统中默认是不带 iostat 命令的,需要自行安装:

$ sudo apt install sysstat

本文中的原始环境为Ubuntu 20.04.1

iostat主要作用

iostat 主要用于监控系统设备的 IO 负载情况,iostat 首次运行时显示自系统启动开始的各项统计信息,之后运行 iostat 将显示自上次运行该命令以后的统计信息。
iostat 的特点是汇报磁盘活动统计情况,同时也会汇报出 CPU 使用情况。CPU 统计数据是作为所有处理器之间的平均值在系统范围内计算的。iostat 也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。

使用

  • 语法格式:
    iostat <options> <device name>
  • 常用选项:
    -c 只显示 CPU 的信息
    -d 只显示设备信息
    --human 以友好的方式显示结果
    -j { ID | LABEL | PATH | UUID | ... } 显示设备的持久化名称
    -k 以 k 为单位显示
    -m 以 m 为单位显示
    -N 显示任何设备映射器设备的注册设备映射器名称,用于查看LVM2统计数据
    -p [ { device [,...] | ALL } ] 显示块设备及其分区的信息
    -t 显示每次输出的时间
    -V 显示 iostat 的版本信息
    -x 显示更多的设备列
    -z 如果没有变化就不重复输出信息
    interval 连续输出,每 interval 秒输出一次
    count 与 interval 连用,指定一共输出多少次

CPU信息

iostat 输出中的 CPU 部分是对CPU使用情况的统计信息(以百分比的形式显示):

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.26    0.01    0.26    0.03    0.00   99.45

user

进程在用户地址空间中消耗 CPU 时间的百分比。像 shell 程序、各种语言的编译器、数据库应用、web 服务器和各种桌面应用都算是运行在用户地址空间的进程。这些程序如果不是处于 idle 状态,那么绝大多数的 CPU 时间都是运行在用户态。[/tab]

nice

可以通过 nice 值调整进程用户态的优先级。这里显示的是调整过 nice 值的进程消耗掉的 CPU 时间。如果系统中没有进程被调整过 nice 值,那么 ni 就显示为 0。

system

进程在内核地址空间中消耗 CPU 时间的百分比。所有进程要使用的系统资源都是由 Linux 内核处理的。当处于用户态(用户地址空间)的进程需要使用系统的资源时,比如需要分配一些内存、或是执行 IO 操作、再或者是去创建一个子进程,此时就会进入内核态(内核地址空间)运行。事实上,决定进程在下一时刻是否会被运行的进程调度程序就运行在内核态。对于操作系统的设计来说,消耗在内核态的时间应该是越少越好。在实践中有一类典型的情况会使 sy 变大,那就是大量的 IO 操作,因此在调查 IO 相关的问题时需要着重关注它。

iowait

CPU 等待磁盘 IO 操作的时间。和 CPU 的处理速度相比,磁盘 IO 操作是非常慢的。有很多这样的操作,比如:CPU 在启动一个磁盘读写操作后,需要等待磁盘读写操作的结果。在磁盘读写操作完成前,CPU 只能处于空闲状态。Linux 系统在计算系统平均负载时会把 CPU 等待 IO 操作的时间也计算进去,所以在我们看到系统平均负载过高时,可以通过 iowait 来判断系统的性能瓶颈是不是过多的 IO 操作造成的。

steal

只有 Linux 在作为虚拟机运行时 steal 才是有意义的。它表示虚机等待 CPU 资源的时间(虚机分到的是虚拟 CPU,当需要真实的 CPU 时,可能真实的 CPU 正在运行其它虚机的任务,所以需要等待)。

idle

CPU 处于 idle 状态的百分比。一般情况下, user + nice + idle 应该接近 100%。

设备信息

设备报告提供每个物理设备或分区的统计信息。可以在命令行中指定要显示统计信息的块设备和分区。如果没有输入设备或分区,那么将显示系统使用的每个设备的统计信息,并提供内核为其维护统计信息。如果命令行上给出了 ALL 关键字,那么将显示系统定义的每个设备的统计信息,包括那些从未使用过的设备。默认情况下,传输速率显示在 1K 块中,除非设置环境变量POSIXLY_CORRECT,在这种情况下使用 512 字节块。根据所使用的标志,报告可显示以下字段:

Device             tps    kB_read/s    kB_wrtn/s    kB_dscd/s    kB_read    kB_wrtn    kB_dscd
scd0              0.00         0.00         0.00         0.00       8420          0          0
vda               1.98         0.07        18.26         0.00     415779  108849956          0

Device

Device 列显示 /dev 目录中列出的设备(或分区)名称。

tps

每秒发送到设备的 I/O 请求数。多个逻辑请求可以组合成对设备的单个 I/O 请求。

Blk_read/s

每秒读取的磁盘块的数量。

Blk_wrtn/s

每秒写入的磁盘块的数量。

Blk_read

读取的块的总数。

Blk_wrtn

写入的总块数。

r/s

设备每秒完成的读请求数(合并后)。

w/s

设备每秒完成的写请求数(合并后)。

sec/s

每秒从设备读取或写入的扇区数。

rsec/s

每秒从设备读取的扇区数。

wsec/s

每秒写入设备的扇区数。

rqm/s

每秒钟排队到设备的合并后的 I/O 请求数量。

rrqm/s

每秒钟排队到设备的合并后的读请求数。

wrqm/s

每秒钟排队到设备的合并后的写请求数。

%rrqm

在发送到设备之前合并到一起的读请求的百分比。

%wrqm

在发送到设备之前合并到一起的写请求的百分比。

areq-sz

向设备发出的 I/O 请求的平均大小(单位为 k)。

rareq-sz

向设备发出的读请求的平均大小(单位为 k)。

wareq-sz

向设备发出的写请求的平均大小(单位为 k)。

await

平均每次 I/O 操作的时间(以毫秒为单位)。这包括请求在队列中花费的时间和执行它们所花费的时间。

r_await

平均每次读请求的时间(以毫秒为单位)。这包括请求在队列中花费的时间和执行它们所花费的时间。

w_await

平均每次写请求的时间(以毫秒为单位)。这包括请求在队列中花费的时间和执行它们所花费的时间。

aqu-sz

发送到设备的请求的平均队列长度。

%util

向设备发出 I/O 请求的运行时间百分比(设备的带宽利用率),换句话说就是一秒中有百分之多少的时间用于 I/O 操作。当连续处理请求的设备的这个值接近100%时,说明产生的 I/O 请求太多,I/O 系统已经满负荷,该磁盘可能存在瓶颈。但是对于并行处理请求的设备,例如 RAID 阵列和现代 SSD,这个数字并不反映它们的性能限制。

常见用法

  1. 默认显示CPU信息和所有的设备信息
root@VM-4-10-ubuntu:~# iostat
Linux 5.4.0-77-generic (VM-4-10-ubuntu)         11/24/2021      _x86_64_        (2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.26    0.01    0.26    0.03    0.00   99.45

Device             tps    kB_read/s    kB_wrtn/s    kB_dscd/s    kB_read    kB_wrtn    kB_dscd
scd0              0.00         0.00         0.00         0.00       8420          0          0
vda               1.98         0.07        18.26         0.00     415779  108849956          0
  1. 只显示CPU信息
root@VM-4-10-ubuntu:~# iostat -c
Linux 5.4.0-77-generic (VM-4-10-ubuntu)         11/24/2021      _x86_64_        (2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.26    0.01    0.26    0.03    0.00   99.45
  1. 只显示设备信息
root@VM-4-10-ubuntu:~# iostat -d
Linux 5.4.0-77-generic (VM-4-10-ubuntu)         11/24/2021      _x86_64_        (2 CPU)

Device             tps    kB_read/s    kB_wrtn/s    kB_dscd/s    kB_read    kB_wrtn    kB_dscd
scd0              0.00         0.00         0.00         0.00       8420          0          0
vda               1.98         0.07        18.26         0.00     416031  108863840          0
  1. 指定某一个设备或多个设备的信息
root@VM-4-10-ubuntu:~# iostat -d vda
Linux 5.4.0-77-generic (VM-4-10-ubuntu)         11/24/2021      _x86_64_        (2 CPU)

Device             tps    kB_read/s    kB_wrtn/s    kB_dscd/s    kB_read    kB_wrtn    kB_dscd
vda               1.98         0.07        18.26         0.00     416031  108865156          0


root@VM-4-10-ubuntu:~# iostat -d vda vdb
Linux 5.4.0-77-generic (VM-4-10-ubuntu)         11/24/2021      _x86_64_        (2 CPU)

Device             tps    kB_read/s    kB_wrtn/s    kB_dscd/s    kB_read    kB_wrtn    kB_dscd
vda               1.98         0.07        18.26         0.00     416031  108865244          0
vdb               1.98         0.07        18.26         0.00     416031  108865244          0
  1. 显示块设备及其分区的信息(可以通过逗号分隔指定多个磁盘设备)
root@VM-4-10-ubuntu:~# iostat -d -p vda
Linux 5.4.0-77-generic (VM-4-10-ubuntu)         11/24/2021      _x86_64_        (2 CPU)

Device             tps    kB_read/s    kB_wrtn/s    kB_dscd/s    kB_read    kB_wrtn    kB_dscd
vda               1.98         0.07        18.26         0.00     416031  108865796          0
vda1              0.00         0.00         0.00         0.00        632          0          0
vda2              1.98         0.07        18.26         0.00     414143  108865796          0

root@VM-4-10-ubuntu:~# iostat -d -p vda,vdb
Linux 5.4.0-77-generic (VM-4-10-ubuntu)         11/24/2021      _x86_64_        (2 CPU)

Device             tps    kB_read/s    kB_wrtn/s    kB_dscd/s    kB_read    kB_wrtn    kB_dscd
vda               1.98         0.07        18.26         0.00     416031  108865796          0
vda1              0.00         0.00         0.00         0.00        632          0          0
vda2              1.98         0.07        18.26         0.00     414143  108865796          0
vdb               1.98         0.07        18.26         0.00     416031  108865796          0
vdb1              0.00         0.00         0.00         0.00        632          0          0
vdb2              1.98         0.07        18.26         0.00     414143  108865796          0
  1. 以M为单位显示数字
Linux 5.4.0-77-generic (VM-4-10-ubuntu)         11/24/2021      _x86_64_        (2 CPU)

Device             tps    MB_read/s    MB_wrtn/s    MB_dscd/s    MB_read    MB_wrtn    MB_dscd
vda               1.98         0.00         0.02         0.00        406     106315          0
  1. 显示时间戳
root@VM-4-10-ubuntu:~# iostat -t -d vda
Linux 5.4.0-77-generic (VM-4-10-ubuntu)         11/24/2021      _x86_64_        (2 CPU)

11/24/2021 03:13:50 PM
Device             tps    kB_read/s    kB_wrtn/s    kB_dscd/s    kB_read    kB_wrtn    kB_dscd
vda               1.98         0.07        18.26         0.00     416031  108867908          0
  1. 显示更多的设备信息
root@VM-4-10-ubuntu:~# iostat -x -d vda
Linux 5.4.0-77-generic (VM-4-10-ubuntu)         11/24/2021      _x86_64_        (2 CPU)

Device            r/s     rkB/s   rrqm/s  %rrqm r_await rareq-sz     w/s     wkB/s   wrqm/s  %wrqm w_await wareq-sz     d/s     dkB/s   drqm/s  %drqm d_await dareq-sz  aqu-sz  %util
vda              0.00      0.07     0.00  36.96    2.31    35.07    1.98     18.26     1.80  47.69    1.26     9.23    0.00      0.00     0.00   0.00    0.00     0.00    0.00   0.22
  1. 连续输出
    iostat支持连续输出信息,可以指定一个以秒为单位的间隔时间,还可以指定输出次数。
root@VM-4-10-ubuntu:~# iostat -d vda 2
Linux 5.4.0-77-generic (VM-4-10-ubuntu)         11/24/2021      _x86_64_        (2 CPU)

Device             tps    kB_read/s    kB_wrtn/s    kB_dscd/s    kB_read    kB_wrtn    kB_dscd
vda               1.98         0.07        18.26         0.00     416491  108884668          0


Device             tps    kB_read/s    kB_wrtn/s    kB_dscd/s    kB_read    kB_wrtn    kB_dscd
vda               0.00         0.00         0.00         0.00          0          0          0


Device             tps    kB_read/s    kB_wrtn/s    kB_dscd/s    kB_read    kB_wrtn    kB_dscd
vda               1.00         0.00         8.00         0.00          0         16          0


root@VM-4-10-ubuntu:~# iostat -d vda 2 3
Linux 5.4.0-77-generic (VM-4-10-ubuntu)         11/24/2021      _x86_64_        (2 CPU)

Device             tps    kB_read/s    kB_wrtn/s    kB_dscd/s    kB_read    kB_wrtn    kB_dscd
vda               1.98         0.07        18.26         0.00     416491  108884684          0


Device             tps    kB_read/s    kB_wrtn/s    kB_dscd/s    kB_read    kB_wrtn    kB_dscd
vda               1.00         0.00        20.00         0.00          0         40          0


Device             tps    kB_read/s    kB_wrtn/s    kB_dscd/s    kB_read    kB_wrtn    kB_dscd
vda               0.00         0.00         0.00         0.00          0          0          0

参考

iostat man page

Last modification:November 24th, 2021 at 03:44 pm