“Warning! Do not trust this field any more. This field will be removed in a future sysstat version.”
# cat /proc/diskstats
8 0 sda 239219 1806 37281259 2513275 904326 88832 50268824 26816609 0 4753060 29329105
8 1 sda1 338 0 53241 6959 154 0 5496 3724 0 6337 10683
8 2 sda2 238695 1797 37226458 2504489 620322 88832 50263328 25266599 0 3297988 27770221
8 16 sdb 1009117 481 1011773 127319 0 0 0 0 0 126604 126604
8 17 sdb1 1008792 480 1010929 127078 0 0 0 0 0 126363 126363
253 0 dm-0 1005 0 8040 15137 30146 0 241168 2490230 0 30911 2505369
253 1 dm-1 192791 0 35500457 2376087 359162 0 44095600 22949466 0 2312433 25325563
253 2 dm-2 47132 0 1717329 183565 496207 0 5926560 7348763 0 2517753 7532688
/proc/diskstats有11个字段,以下内核文档解释了它们的含义https://www.kernel.org/doc/Documentation/iostats.txt,我重新表述了一下,注意除了字段#9之外都是累计值,从系统启动之后一直累加:
(rd_ios)读操作的次数。 (rd_merges)合并读操作的次数。如果两个读操作读取相邻的数据块时,可以被合并成一个,以提高效率。合并的操作通常是I/O scheduler(也叫elevator)负责的。 (rd_sectors)读取的扇区数量。
(rd_ticks)读操作消耗的时间(以毫秒为单位)。每个读操作从__make_request()开始计时,到end_that_request_last()为止,包括了在队列中等待的时间。 (wr_ios)写操作的次数。
(wr_merges)合并写操作的次数。
(wr_sectors)写入的扇区数量。
(wr_ticks)写操作消耗的时间(以毫秒为单位)。
(in_flight)当前未完成的I/O数量。在I/O请求进入队列时该值加1,在I/O结束时该值减1。注意:是I/O请求进入队列时,而不是提交给硬盘设备时。
(io_ticks)该设备用于处理I/O的自然时间(wall-clock time)。请注意io_ticks与rd_ticks(字段#4)和wr_ticks(字段#8)的区别,rd_ticks和wr_ticks是把每一个I/O所消耗的时间累加在一起,因为硬盘设备通常可以并行处理多个I/O,所以rd_ticks和wr_ticks往往会比自然时间大。而io_ticks表示该设备有I/O(即非空闲)的时间,不考虑I/O有多少,只考虑有没有。在实际计算时,字段#9(in_flight)不为零的时候io_ticks保持计时,字段#9(in_flight)为零的时候io_ticks停止计时。 (time_in_queue)对字段#10(io_ticks)的加权值。字段#10(io_ticks)是自然时间,不考虑当前有几个I/O,而time_in_queue是用当前的I/O数量(即字段#9 in-flight)乘以自然时间。虽然该字段的名称是time_in_queue,但并不真的只是在队列中的时间,其中还包含了硬盘处理I/O的时间。iostat在计算avgqu-sz时会用到这个字段。 iostat(1)是以/proc/diskstats为基础计算出来的,因为/proc/diskstats并未把队列等待时间和硬盘处理时间分开,所以凡是以它为基础的工具都不可能分别提供disk service time以及与queue有关的值。 注:下面的公式中“Δ”表示两次取样之间的差值,“Δt”表示采样周期。
-
tps:每秒I/O次数=[(Δrd_ios+Δwr_ios)/Δt]
-
r/s:每秒读操作的次数=[Δrd_ios/Δt]
-
w/s:每秒写操作的次数=[Δwr_ios/Δt]
-
rkB/s:每秒读取的千字节数=[Δrd_sectors/Δt]*[512/1024]
-
wkB/s:每秒写入的千字节数=[Δwr_sectors/Δt]*[512/1024]
-
rrqm/s:每秒合并读操作的次数=[Δrd_merges/Δt]
-
wrqm/s:每秒合并写操作的次数=[Δwr_merges/Δt]
-
avgrq-sz:每个I/O的平均扇区数=[Δrd_sectors+Δwr_sectors]/[Δrd_ios+Δwr_ios]
-
avgqu-sz:平均未完成的I/O请求数量=[Δtime_in_queue/Δt](手册上说是队列里的平均I/O请求数量,更恰当的理解应该是平均未完成的I/O请求数量。)
-
await:每个I/O平均所需的时间=[Δrd_ticks+Δwr_ticks]/[Δrd_ios+Δwr_ios]
(不仅包括硬盘设备处理I/O的时间,还包括了在kernel队列中等待的时间。)
-
r_await:每个读操作平均所需的时间=[Δrd_ticks/Δrd_ios] -
w_await:每个写操作平均所需的时间=[Δwr_ticks/Δwr_ios] -
%util:该硬盘设备的繁忙比率=[Δio_ticks/Δt]表示该设备有I/O(即非空闲)的时间比率,不考虑I/O有多少,只考虑有没有。 -
svctm:已被废弃的指标,没什么意义,svctm=[util/tput]
对iostat(1)的恰当解读有助于正确地分析问题,我们结合实际案例进一步讨论。
关于rrqm/s和wrqm/s
%util与硬盘设备饱和度
await多大才算有问题
http://cseweb.ucsd.edu/classes/wi01/cse102/sol2.pdf
Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sdg 0.00 0.00 133.00 0.00 2128.00 0.00 16.00 1.00 7.50 7.49 99.60
对磁盘阵列来说,因为有硬件缓存,写操作不等落盘就算完成,所以写操作的service time大大加快了,如果磁盘阵列的写操作不在一两个毫秒以内就算慢的了;读操作则未必,不在缓存中的数据仍然需要读取物理硬盘,单个小数据块的读取速度跟单盘差不多。
来源:http://linuxperf.com/?p=156
近期好文: Web 通信协议,你还需要知道:SPDY 和 QUIC
“高效运维”公众号诚邀广大技术人员投稿,
投稿邮箱:[email protected],或添加联系人微信:greatops1118. 点个“在看”,一年不宕机 本文始发于微信公众号(高效运维):一文聊聊容易被误读的 IOSTAT
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论