iostat 命令是 I/O statistics(输入/输出统计)的缩写,用来报告系统的 CPU 统计信息和块设备及其分区的 IO 统计信息。iostat 是 sysstat 工具集的一个工具,在 Ubuntu 系统中默认是不带 iostat 命令的,需要自行安装:
$ sudo apt install sysstat
注意:本文中 demo 的演示环境为 ubuntu 18.04。
主要作用
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 使用情况的统计信息(以百分比的形式显示):
user
进程在用户地址空间中消耗 CPU 时间的百分比。像 shell 程序、各种语言的编译器、数据库应用、web 服务器和各种桌面应用都算是运行在用户地址空间的进程。这些程序如果不是处于 idle 状态,那么绝大多数的 CPU 时间都是运行在用户态。
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
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,这个数字并不反映它们的性能限制。
常见用法
默认显示 CPU 信息和所有的设备信息
$ iostat
只显示 CPU 的信息
$ iostat -c
只显示设备信息
$ iostat -d
还可以指定只显示某一个或多个设备的信息
显示块设备及其分区的信息
$ iostat -d -p sdb
还可以通过逗号分隔同时指定多个磁盘设备:
以 M 为单位显示数字
$ iostat -m -d sdb
显示时间戳
$ iostat -t -d sdb
显示更多的设备信息
$ iostat -x -d sda
连续输出
iostat 支持连续地输出信息,我们只要指定一个以秒为单位的间隔时间就行了:
$ iostat -d sda
此时,每隔两秒会输出一次信息。还可以再指定一个数字告诉 iostat 一共输出多少次信息,比如每隔两秒输出一次,一共输出三次的写法为:
$ iostat -d sda
显示 LVM2 设备的映射名称
$ iostat -d -N
显示设备的持久化名称
$ iostat -d -j ID
除了 ID,还可以指定 LABEL、PATH 和 UUID 等显示方式。