iostat

iostat是一个基于/proc/diskstats文件计算的IO统计工具,它在周期性的去读取/proc/diskstats的IO统计信息并通过一定的公式计算出来。输出如下:

$iostatLinux 4.4.0-116-generic (jpc)   03/18/2018  _x86_64_    (8 CPU)
avg-cpu:  %user   %nice %system %iowait  %steal   %idle           
          5.94    0.08    3.02    2.08    0.00   88.89
Device: tps      kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda     12.15       243.01       110.93    5014986    2289276
sdb     17.88        83.01        89.09    1712994    1838461
$iostat
Linux 4.4.0-116-generic (jpc)   03/18/2018  _x86_64_    (8 CPU)
avg-cpu:  %user   %nice %system %iowait  %steal   %idle           
          5.94    0.08    3.02    2.08    0.00   88.89
Device: tps      kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda     12.15       243.01       110.93    5014986    2289276
sdb     17.88        83.01        89.09    1712994    1838461

tps:transfer per second,每秒传输的IO数量
kB_read/s:每秒读取的KB数量
kB_wrtn/s:每秒写的KB数量
kB_read:累计读取的KB数
kB_wrtn:累计写的KB数量

$iostat -x
Linux 4.4.0-116-generic (jpc)   03/18/2018  _x86_64_    (8 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle   5.11    0.19    3.10    1.83    0.00   89.78
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.06     7.13   18.23    7.51   614.39   163.88    60.47     0.03     1.11   0.64     2.27     0.42   1.09
sdb    0.77     3.13   15.46   11.81   249.41   128.89    27.75     0.08     3.03   0.52     6.32     0.18   0.49

rrqm/s:每秒合并读IO的次数
wrqm/s:每秒合并写IO的次数
r/s:每秒读IO完成的次数
w/s:每秒写IO完成的次数
rkB/s:每秒读IO的KB数量
wkB/s:每秒写IO的KB数量
avgrq-sz:平均IO扇区数
avgqu-sz:平均未完成的IO数量,包括在队列中的和硬件正在处理的。
await:平均每个IO耗时,包括在队列中和硬件操作的时间。
r_wait:平均每个读IO耗时**w_wait**:平均每个写IO耗时
svctm:Warning! Do not trust this field any more. This field will be removed in a future sysstat version
%util:磁盘利用率,只要有IO操作就算,由于硬件的并发处理IO能力,即使%util达到100%也不意味着已达存储介质的性能极限,只能说明在这个统计周期内,该介质一直都有IO操作。

/proc

/proc/diskstats

Linux的/proc存储了很多系统级统计信息,与IO相关的信息都存储在diskstat中,输出如下

$cat /proc/diskstats
sda 120880 392 8323045 78832 53591 51267 2315680 115900 0 76384 194700

一共11个字段,在内核文档””中有详细的解释,除了Field9之外,其他字段都是从开始计数的累计值。以sda为例,前两个分别是设备的major和minor,接下来分别是:

Field 1 – rd_io,表示120880个读IO被完成
Field 4 – rd_ticks,读操作一共耗时78832ms,从__make_request开始,到end_that_make_request()为止,包括在队列中等待的时间。
Field 5 – wr_io,表示53591个写IO被完成
Field 6 – wr_merges,表示发生了51267次写IO合并
Field 7 – wr_sectors,表示2315680个被写的扇区
Field 8 – wr_ticks,写操作一共耗时115900ms,
Field 9 – in_flight,IO队列中遗留了0个IO尚未处理,当有一个IO进入IO队列时,该值+1,每完成一个IO,该值-1
Filed 10 – io_ticks,表示处理IO花费了76384ms的自然时间,即只要in_flight不为0,io_ticks就在计数。io_ticks不是rd_ticks和wr_ticks的和,因为rd_ticks和wr_ticks是针对IO而言的,由于设备往往有并行处理IO的能力,所以io_ticks往往小于rd_ticks+wr_ticks。
Field 11 – time_in_queue,系统一共花费了194700ms用于IO操作
Field 2 – rd_merges,表示发生了392次读IO合并
Field 3 – rd_sectors,表示8323045个被读取的扇区