(转)通过『iostat -dx 1』命令监控IO性能

http://huoding.com/2011/07/13/91

网站的很多性能问题最终都会归结到IO头上,所以说理解iostat命令是非常有必要的。

小技巧:你知道iostat是从哪里得到IO相关信息的吗?使用strace命令能跟踪到答案:

shell>strace-eopeniostat

open("/proc/diskstats",O_RDONLY)注:Strace教程:5simplewaystotroubleshootusingStrace

注:关于diskstats的说明,参见官方文档(主要是其中的field1~field11部分)。

如果你的操作系统里没有iostat命令的话,除了从源代码安装,还可以使用下面方式:

Centos/Fedora的安装方式是:yuminstallsysstat

Debian/Ubuntu的安装方式是:aptitudeinstallsysstat

我最常用的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是平均请求队列的长度。毫无疑问,队列长度越短越好。

说明:svctm参数在未来某个版本的iostat会被删除,官方文档是这样描述原因的:

Theaverageservicetime(svctmfield)valueismeaningless,asI/Ostatisticsarecalculatedatblocklevel,andwedon’tknowwhenthediskdriverstartstoprocessarequest.Forthisreason,thisfieldwillberemovedinafuturesysstatversion.

另外,有时候iostat会显示一些很离谱的结果,官方FAQ给出了如下的解释:

BecauseofaLinuxkernelbug,iostat-xmaydisplayhugeI/Oresponsetimes(svctm)andabandwidthutilization(%util)of100%forsomedevices.Indeedthesedeviceshaveavalueforthefield#9(beginningafterthedevicename)in/proc/{partitions,diskstats}whichisalwaysdifferentfrom0,andevennegativesometimes.Yetthisfieldshouldgotozero,sinceitgivesthenumberofI/Oscurrentlyinprogress(itisincrementedasrequestsaresubmitted,anddecrementedastheyfinish).To(temporarily)solvetheproblem,youshouldrebootyoursystemtoresetthecountersin/proc/{partitions,diskstats}.

如果大家想要更系统的了解关于IO的相关知识,可以参考如下资料:

GettingthehangofIOPS

BasicI/OMonitoringonLinux

相关推荐