使用iostat监控IO

我们可以通过iostat查看I/O性能数据

[root@mio-254 ~]# iostat -x
Linux 2.6.32-431.el6.x86_64 (mio-254)   09/07/2014      _x86_64_        (4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           2.56    0.00    0.39    0.29    0.00   96.76

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sdb                 0.02         0.25        0.04    0.91  1.79       7.25            9.51      0.02          18.68  15.27   1.45
sda                 0.00         0.42        0.03    0.54  1.89       14.12         27.99     0.00          6.44   3.68   0.21
dm-0              0.00         0.00        0.08    1.66   3.67      21.37         14.35     0.20         116.57   9.34   1.63

其中磁盘设备的数据含义如下:

rrqm/s 合并后每秒发送到设备的读入请求数

wrqm/s 合并后每秒发送到设备的写入请求数

r/s 每秒发送到设备的读入请求数

w/s 每秒发送到设备的写入请求数

rsec/s 每秒从设备读入的扇区数

wsec/s 每秒向设备写入的扇区数

rkb/s 每秒从设备读入的数据量

wkb/s 每秒想设备写入的数据量

avgrq-sz 发送到设备的请求的平均大小,单位是扇区

avgqu-sz 发送到设备的请求平均队列长度

await I/O平均请求执行执行时间,单位是毫秒

svctm 发送到设备I/O请求的平均执行时间,单位是毫秒

%util 在I/O请求发送到设备期间,占用CPU时间的百分比

一般来说,我们关心每秒的读写请求数,队列长度,请求执行时间和I/O占CPU的百分比

估算单块磁盘的IOPS

对于磁盘I/O,我们需要明确一件事情,即I/O性能优化是不可能无限提高的,所有机械硬盘的IOPS都在最根本上受限于机械转动的原理

机械硬盘完成一次I/O操作所需的时间主要包括寻道时间,盘片转动延时和数据传输时间

寻道时间,指将磁头移动到正确磁道上的时间,这个时间一般算作磁盘转动半周所需要的时间,假设一个15000转的磁盘,那么转动延迟就是60/15000/2 = 0.002S

传输时间,因为磁盘的数据传输率一般都高达数百兆,所以这个时间可以忽略不计

这样,我们就可以通过简单计算得到单块磁盘的极限

转速         IOPS

5400        50~80

7200        75-100

10000      125-150

15000      175-210

当然,整个服务器的IOPS取决于下列多个因素

多块磁盘组:通俗的说,磁盘多了,IOPS就会更高,一块150,两块300(不完全是这样)

更快的单盘:转速越高IOPS越高

RAID级别:如果使用RAID来组合多块磁盘,需要注意有些等级RAID会对写操作性能有较大影响,一次请求发生的磁盘操作越少,IOPS越高

读写比例:如果写操作较多,而RAID又设置成了膨胀写操作的RAID级别,那么就会影响IOPS