关于IO的各项指标,基本上从文件/proc/diskstats文件获取就可以了,所以首先简单介绍下该文件的各个域。
8 0 sda 404401 41618 43058034 767156 76322193 498634263 4599837328 2847411684 0 340610149 2848016085
这是从我用的服务器上的/proc/diskstats中选择的一条,从前往后,各个域为:
major:设备的主ID号
minor:设备的辅ID号
dev_name:设备名
rd_ios:读完成的次数
rd_merges:读取合并的次数,为了效率可能会合并相邻的读和写
rd_sectors:读取的扇区数
rd_ticks:读花费的毫秒数
wr_ios:写完成的次数
wr_merges:写合并的次数,为了效率可能会合并相邻的读和写
wr_sectors:写的扇区数,写成功的总得扇区数
wr_ticks:写花费的毫秒数
ios_pgr:正在处理的IO数
tot_ticks:输入/输出操作花费的毫秒数
rq_ticks:与ios_pgr相关,表示加权的毫秒数,就是说当前队列中的io请求数乘以经过的毫秒数,所以想要获取平均队列长度,只需要该值除以经过的毫秒数,举个例子:在超市排队买东西,后面10个人等待第一个人付钱,第一个人花了1分钟付钱,那么这10个人总花费的时间是1*10=10分钟。也就是说它计算的是时间与当前等待个数的乘积。
在我使用的服务器上的iostat -xm的打印内容包含如下指标,其中svctm在新的iostat中已经废除了,所以之后不会讨论该域,大体的计算方法为两次读取/proc/diskstats,计算两次读取的差值除以两次读取的时间的,具体计算方法如下:
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
rrqm/s:每秒合并的读操作次数,计算方法:两次读取rd_merges的差值,除以两次读取的时间间隔
wrqm/s:每秒合并的写操作次数,计算方法:两次读取wr_merges的差值,除以两次读取的时间间隔
r/s:每秒的读次数,计算方法:两次读取rd_ios的差值,除以两次读取的时间间隔
w/s:每秒的写次数,计算方法:两次读取wr_ios的差值,除以两次读取的时间间隔
rMB/s:以兆为单位,每秒读的MB字节数,计算方法:两次读取rd_sectors的差值,除以两次读取的时间间隔,再除以2048(2*1024,因为rd_sectors是扇区单位,一个扇区一般为512字节,除以2为KB,再除以1024为MB)
wMB/s:以兆为单位,每秒写的MB字节数,计算方法:参考rMB/s
avgrq-sz:在新版本的iostat中,该域为arqsz,平均请求的大小,计算方法:两次读取的rd_sectors和wr_sectors的和的差值除以两次读取的rd_ios和wr_ios的和的差值
avgqu-sz:在新版本的iostat中,该域为aqu_sz,平均队列长度,计算方法:两次读取的rq_ticks的差值除以两次读取时间间隔的毫秒数
await:平均每次读写花费的时间(ms),计算方法:两次读取的rd_ticks的差值加上两次读取的wr_ticks的差值,除以两次读取的rd_ios和wr_ios差值的和
r_await:每次读花费的时间(ms),计算方法参考await,只计算rd_ticks和rd_ios
w_await:每次写花费的时间(ms) ,计算方法参考await,只计算wr_ticks和wr_ios
util:设备的带宽利用率,即IO读写时间占总时间的比例,计算方法:两次读取的tot_ticks的差值除以两次读取的时间间隔
关于上面各域的特殊说明:
util:该域没有考虑磁盘的并发能力,所以当磁盘有并发能力时,该值为100%时无法代表磁盘处理能力饱和,所以该值往往不能当作磁盘性能瓶颈的参考
await:不仅包括硬盘设备读操作的时间,也包括在内核队列中的时间
个人理解:io的繁忙程度,主要查看await和avgqu-sz(aqu_sz),await表示的是io请求的服务加等待时间,而aqu_sz表示的是等待队列的长度,所以await本身应该也是受aqu_sz影响的,这两个值越大,表示当前的io越繁忙,而util和已经被废弃的svctm指标应该没有太大作用,因为util并没有考虑磁盘的并行处理能力