前言:

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请求在等待