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)
这些列的具体信息如下:
%usrCPU在用户模式下的时间百分比%niceCPU处在带NICE值的用户模式下的时间百分比
%systemCPU在系统模式下的时间百分比%iowaitCPU等待输入输出完成时间的百分比%steal管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比%idleCPU空闲时间百分比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就是磁盘IOPSw/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单位)svctmio请求平均处理时间(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请求在等待
好文共赏:
iowait与io负载之间的关系,参考:https://www.cnblogs.com/muahao/p/6438409.html