zrenpro 2011-09-25
小技巧:你知道iostat是从哪里得到IO相关信息的吗?使用strace命令能跟踪到答案:
shell>strace-eopeniostat
open("/proc/diskstats",O_RDONLY)
注:关于diskstats的说明,参见官方文档(field1~field11)。
我最常用的iostat命令格式是:『iostat-dx1』,意思是每隔一秒显示一次IO扩展信息。
shell>iostat-dx1
Device:rrqm/swrqm/sr/sw/srsec/swsec/s
sda0.1837.710.652.6350.18322.08
avgrq-szavgqu-szawaitsvctm%util
113.460.35107.491.670.55
Device:rrqm/swrqm/sr/sw/srsec/swsec/s
sda0.004208.000.00165.000.00163872.00
avgrq-szavgqu-szawaitsvctm%util
993.16119.541144.366.07100.10
注:开头显示的是自系统启动开始的平均值,后面显示的是每段时间间隔里的平均值。
介绍一下相关参数的含义:
#rrqm/s:队列中每秒钟合并的读请求数量
#wrqm/s:队列中每秒钟合并的写请求数量
#r/s:每秒钟完成的读请求数量
#w/s:每秒钟完成的写请求数量
#rsec/s:每秒钟读取的扇区数量
#wsec/s:每秒钟写入的扇区数量
#avgrq-sz:平均请求数据的大小
#avgqu-sz:平均请求队列的长度
#await:平均每次请求的等待时间
#svctm:平均每次请求的服务时间
#util:设备的利用率
注:建议对照源代码来记忆这些参数都是如何计算出来的。
关于这些参数,相对重要的是后面几个,具体来说是:util,svctm,await,avgqu-sz:
util是设备的利用率。如果它接近100%,通常说明设备能力趋于饱和(并不绝对,比如设备有写缓存)。有时候可能会出现大于100%的情况,这多半是计算时四舍五入引起的。
svctm是平均每次请求的服务时间。这里有一个公式:(r/s+w/s)*(svctm/1000)=util。举例子:如果util达到100%,那么此时svctm=1000/(r/s+w/s),假设IOPS是1000,则svctm大概在1毫秒左右,如果长时间大于这个数值,说明系统出了问题。
await是平均每次请求的等待时间。这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。
avgqu-sz是平均请求队列的长度。毫无疑问,队列长度越短越好,这就不用多做解释了。
提醒:如果是RAID等多盘系统,iostat结果的参考价值可能有变化,建议查阅相关资料。