iostat命令 :报告系统CPU和IO相关统计信息。
iostat 第一行会输出 - 系统版本内信息 - 统计开始时间 - cpu数量
/ # iostat
Linux 4.13.3-1.el7.elrepo.x86_64 (web-006.tqt.bx.sinanode.com) 11/27/18 _x86_64_ (24 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
5.12 0.00 2.51 0.05 0.00 92.32
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 7.61 22.47 414.91 629294561 11620523644
下面想讲讲iostat几个重要参数。
-c 显示cpu统计数据
-d 显示硬盘统计数据
-k 以kb单位显示数据
-m 以mb单位线束数据
-p [ { device [,...] | ALL } ] 显示指定硬盘信息或者显示所有硬盘信息
-x 显示详细的统计信息
输出分为 CPU 和IO统计信息
CPU统计数据
%user 用户执行或者应用程序占用cpu的百分比
%nice 在用户级别上以较高的优先级执行时发生的CPU利用率。
%system 系统级别(内核)占用cpu的百分比
%iowait cpu再等待io返回的空闲时态时间百分比
%steal 显示虚拟CPU或CPU在管理程序服务另一个虚拟处理器时在非自愿等待中花费的时间百分比。
%idle cup的空闲百分比
%iowait 如果持续高占比,系统存在io瓶颈。
%idle 如果持续走低,系统可能出现很问题。(比如代码导致死循环,长时间等待数据库返回等)
IO统计数据
Device 这一列给出了/dev目录中列出的设备(或分区)名称。
tps 每秒发起的读写请求,相同扇区或者相邻扇区的请求会被合并
rrqm/s 每秒合并读操作的次数
wrqm/s 每秒合并写操作的次数
r/s 每秒完成的读请求
w/s 每秒完成的写请求
rkB/s 每秒读取的kB字节数
wkB/s 每秒写取的kB字节数
avgrq-sz IO请求的平均扇区数,即所有请求的平均大小,以扇区(512字节)为单位
avgqu-sz IO请求的平均队列长度
await 平局每个IO请求的时间,包括请求返回的时间和在队列中花费的时间
r_await 平局每个读请求的时间,包括请求返回的时间和在队列中花费的时间
w_await 平局每个写请求的时间,包括请求返回的时间和在队列中花费的时间
svctm 平局每个请求的执行时间。(这个指标已经废弃)
%util 工作时间占比,接近100%事可能出现系统瓶颈
avgqu-sz 该值越大,表示排队等待处理的io越多。
avgrq-sz 用户的请求是大IO,还是小IO通过这个值可以看出来。他的含义是指可这段时间用户请求数据>的大小。IO 大小 = avgrq-sz * 512字节 ,但是个值不会无限大,是受系统限制的,
cat /sys/block/sdc/queue/max_sectors_kb 128
128kB / 512B = 256 我的系统最大可用扇区256(不同系统可能不一样),如果这个值持续饱和,说明用户请求IO可能比较大。
await = 所有IO请求耗时/ 所有IO请求数,这个值是包含请求在队列里面的耗时 所以又有
await = 所有IO请求平均执行耗时 + 所有IO请求的平均队列耗时
从上面的计算公式可以得出单纯的看await值大并不能看出问题,(可能流量小的时候这个值会比较大)
举个例子:
单独一次请求耗时2ms,
a.250个IO请求同时进入等待队列
b.250个IO请求依次发起,待上一个IO完成后,发起下一个IO
第一种情况await高达500ms,第二个情况await只有4ms
这个时候我们要具体问题具体分析。不能武断的使用数值判断性能。
%util 这个值同样不能武断的使用,在不同流量下表现可能不太一样。但是如果持续维持再高点,我们一定要注意。
常用方法
# iostat -x 2 //每2秒输出一次数据
Linux 3.10.0-229.el7.x86_64 (web-004.tqt.bx.sinanode.com) 11/27/18 _x86_64_ (24 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
9.98 0.00 1.03 0.07 0.00 88.91
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.02 8.87 0.54 9.26 12.11 589.05 122.68 0.00 0.18 1.39 0.11 2.17 2.13
avg-cpu: %user %nice %system %iowait %steal %idle
27.75 0.00 1.34 0.00 0.00 70.90
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 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
# iostat -x 2 2 #2秒中输出一个 总计数据2个
Linux 3.10.0-229.el7.x86_64 (web-004.tqt.bx.sinanode.com) 11/27/18 _x86_64_ (24 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
9.98 0.00 1.03 0.07 0.00 88.91
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.02 8.87 0.54 9.26 12.11 589.05 122.68 0.00 0.18 1.39 0.12 2.17 2.13
avg-cpu: %user %nice %system %iowait %steal %idle
27.11 0.00 1.36 0.57 0.00 70.97
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 57.50 0.00 4.50 0.00 248.00 110.22 0.05 11.22 0.00 11.22 5.89 2.65
写到这里对iostat 介绍的就差不多了,iostat命令数据的结果受很多因素的影响,我们不能武断的使用统计结果,要多多思考才能有更大的帮助。
本文参考了 Bean Li 深入理解iostat 感谢前辈大神的分享,文章内容有很多干货,建议大家看看。