前言:
iostat(I/O statistics)工具,对系统的磁盘操作活动进行监控。
类似于vmstat,它只能对系统整体情况进行分析,无法对特定进程进行分析。
1.iostat基本输出
iostat命令默认输出结果如下:
root@7bc18553126f:/tmp# iostat
Linux 5.10.76-linuxkit (7bc18553126f) 03/27/22 _aarch64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.66 0.00 1.15 0.01 0.00 98.18
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 4.17 105.49 176.36 8109875 13558684
它不仅展示了磁盘信息(Device),还展示了CPU信息(avg-cpu)
这些列的具体信息如下:
%usr | CPU在用户模式下的时间百分比 |
%nice | CPU处在带NICE值的用户模式下的时间百分比 |
%system | CPU在系统模式下的时间百分比 |
%iowait | CPU等待输入输出完成时间的百分比 |
%steal | 管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比 |
%idle | CPU空闲时间百分比 |
tps | 该设备每秒传输次数 |
kB_read/s | 每秒从设备读取的数据量 |
kB_wrtn/s | 每秒向设备写入的数据量 |
kB_read | 读取的总数据量 |
kB_wrtn | 写入的总数据量 |
注意:针对CPU这一行,我们可以根据输出作出以下判断:
* %iowait值过高:硬盘存在io瓶颈
* %idle高但是系统响应慢,有可能是CPU等待分配内存,此时需要加载内存容量;
* %idle持续低于CPU核数,表明CPU一直比较繁忙,此时CPU资源是瓶颈
2.iostat磁盘详细输出
使用iostat -x可以输出磁盘更详细信息
root@7bc18553126f:/tmp# iostat -x
Linux 5.10.76-linuxkit (7bc18553126f) 03/27/22 _aarch64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.65 0.00 1.14 0.01 0.00 98.19
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
vda 3.35 0.78 104.54 174.77 0.66 3.90 16.41 83.37 0.17 1.40 0.00 31.20 224.66 0.39 0.16
明显看出来此时Device行有更多信息输出,我们来看下每列的含义
r/s | 每秒读次数 | r/s+w/s就是磁盘IOPS |
w/s | 每秒写次数 | |
rkB/s | 每秒读数据量(KB单位) | rkB/s+wkB/s就是磁盘吞吐量 |
wkB/s | 每秒写数据量(KB单位) | |
rrqm/s | 每秒merge的读数据量 | |
wrqm/s | 每秒merge的写数据量 | |
%rrqm | 读请求merge发送到磁盘的百分比 | |
%wrqm | 写请求merge发送到磁盘的百分比 | |
r_await | 读请求处理完成平均等待时间(ms单位) 包含请求在队列中的等待时间和设备实际处理的时间 | r_await+w_await就是磁盘对请求响应时间 |
w_await | 写请求处理完成平均等待时间(ms单位) 包含请求在队列中的等待时间和设备实际处理的时间 | |
aqu-sz | 平均请求队列长度 | |
rareq-sz | 平均读请求大小(KB单位) | |
wareq-sz | 平均写请求大小(KB单位) | |
svctm | io请求平均处理时间(ms单位) | |
%util | 磁盘处理IO请求的事件百分比 | 磁盘IO使用率 |
有关于rrqm/s wrqm/s这里的merge是什么意思呢?
我们来看下原文解释
rrqm/s
The number of read requests merged per second that were queued to the device.
wrqm/s
The number of write requests merged per second that were queued to the device.
这里就不得不说下通用块层了。
通用块层是处在文件系统和磁盘驱动中间的一个块设备抽象层,主要有三个功能:
* 为文件系统和应用程序提供访问块设备的标准接口;
* 把各种异构的磁盘设备抽象为统一的块设备,并提供统一框架来管理这些设备的驱动程序
* 把文件系统和应用程序发来的I/O请求排队,并通过重新排序、请求合并等方式,提高磁盘读写的效率
3.定时刷新信息
同vmstat一样,定时刷新在我们实际查看问题是比较有意义的结果
# -d 指定只输出磁盘信息
# -x 展示磁盘信息扩展项
# 2秒输出一次
root@7bc18553126f:/tmp# iostat -d -x 2
Linux 5.10.76-linuxkit (7bc18553126f) 03/27/22 _aarch64_ (4 CPU)
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
vda 3.29 0.76 102.58 171.49 0.65 3.83 16.41 83.37 0.17 1.40 0.00 31.20 224.61 0.39 0.16
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
vda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
vda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
4.指定展示单位
iostat输出项我们可以指定输出单位,以M、KB均可
# 1.指定以MB为单位展示
root@7bc18553126f:/tmp# iostat -m
Linux 5.10.76-linuxkit (7bc18553126f) 03/27/22 _aarch64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.65 0.00 1.13 0.01 0.00 98.21
Device tps MB_read/s MB_wrtn/s MB_read MB_wrtn
vda 4.04 0.10 0.17 7920 13240
# 2.指定以KB为单位展示
root@7bc18553126f:/tmp# iostat -k
Linux 5.10.76-linuxkit (7bc18553126f) 03/27/22 _aarch64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.65 0.00 1.13 0.01 0.00 98.21
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 4.04 102.27 170.97 8110535 13558780
# 3.指定以human 可视化结果
root@7bc18553126f:/tmp# iostat -h
Linux 5.10.76-linuxkit (7bc18553126f) 03/27/22 _aarch64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.6% 0.0% 1.1% 0.0% 0.0% 98.2%
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda
4.04 102.3k 171.0k 7.7G 12.9G
常用-h即可
总结:
注意通过观察输出项来获取当前系统运行情况
CPU相关:
* %iowait值过高:硬盘存在io瓶颈
* %idle高但是系统响应慢,有可能是CPU等待分配内存,此时需要加载内存容量;
* %idle持续低于CPU核数,表明CPU一直比较繁忙,此时CPU资源是瓶颈
IO相关:
* %util接近100%,说明产生的IO请求过多,IO系统已经满负荷,磁盘成为瓶颈;
* svctm接近await,说明IO几乎没有等待时间
* await远大于svctm,说明IO队列过长,io响应太慢
* aqu-sz比较大,说明当前有不少io请求在等待