网站的很多性能问题最终都会归结到IO头上,所以说理解iostat命令是非常有必要的。
如果你的操作系统里没有iostat命令的话,除了从源代码安装,还可以使用下面方式:
Centos/Fedora的安装方式是:yum install sysstat Debian/Ubuntu的安装方式是:aptitude install sysstat
下面是自己linode VPS的IO信息:
[root@li411-195 ~]# iostat -x 1 Linux 3.9.3-x86 11/16/2013 i686 (8 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.48 0.00 0.12 0.02 0.48 98.91 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util xvda 0.03 12.88 0.33 2.55 19.62 123.45 49.58 0.08 26.06 0.48 0.14 xvdb 0.00 0.00 0.00 0.00 0.01 0.02 17.14 0.00 32.23 3.00 0.00 avg-cpu: %user %nice %system %iowait %steal %idle 0.00 0.00 0.00 0.00 0.12 99.88 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util xvda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 xvdb 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
命令:iostat -x l 表示每隔一秒显示一次IO信息。
注:开头显示的是自系统启动开始的平均值,后面显示的是每段时间间隔里的平均值。
下面介绍一下IO信息中个参数的含义:
rrqm/s: 每秒进行 merge 的读操作数目.即 delta(rmerge)/s wrqm/s: 每秒进行 merge 的写操作数目.即 delta(wmerge)/s r/s: 每秒完成的读 I/O 设备次数.即 delta(rio)/s w/s: 每秒完成的写 I/O 设备次数.即 delta(wio)/s rsec/s: 每秒读扇区数.即 delta(rsect)/s wsec/s: 每秒写扇区数.即 delta(wsect)/s rkB/s: 每秒读K字节数.是 rsect/s 的一半,因为每扇区大小为512字节.(需要计算) wkB/s: 每秒写K字节数.是 wsect/s 的一半.(需要计算) avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区).delta(rsect+wsect)/delta(rio+wio) avgqu-sz: 平均I/O队列长度.即 delta(aveq)/s/1000 (因为aveq的单位为毫秒). await: 平均每次设备I/O操作的等待时间 (毫秒).即 delta(ruse+wuse)/delta(rio+wio) svctm: 平均每次设备I/O操作的服务时间 (毫秒).即 delta(use)/delta(rio+wio) %util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的.即 delta(use)/s/1000 (因为use的单位为毫秒)
关于这些参数,相对重要的是后面几个,具体来说是: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是平均请求队列的长度。毫无疑问,队列长度越短越好。
参考资料:http://www.php-oa.com/2009/02/03/iostat.html