通常,我们很容易观察到数据库服务器的内存和CPU压力。但是对I/O压力没有直观的判断方法。
磁盘有两个重要的参数:Seek time、Rotational latency。
正常的I/O计数为:①1000/(Seek time+Rotational latency)*0.75,在此范围内属正常。当达到85%的I/O计数以上时则基本认为已经存在I/O瓶颈。理论情况下,磁盘的随机读计数为125、 顺序读计数为225。对于数据文件而言是随机读写,日志文件是顺序读写。因此,数据文件建议存放于RAID5上,而日志文件存放于RAID10或 RAID1中。
下面假设在有4块硬盘的RAID5中观察到的Physical Disk性能对象的部分值:
Avg. DiskQueue Length 12 队列长度
Avg. DiskSec/Read .035 读数据所用时间ms
Avg. DiskSec/Write .045 写数据所用时间ms
DiskReads/sec 320 每秒读数据量
DiskWrites/sec 100 每秒写数据量
Avg. DiskQueue Length,12/4=3,每块磁盘的平均队列建议不超过2。
Avg. DiskSec/Read一般不要超过11~15ms。
Avg. DiskSec/Write一般建议小于12ms。
从上面的结果,我们看到磁盘本身的I/O能力是满足我们的要求的,原因是因为有大量的请求才导致队列等待,这很可能是因为你的SQL语句导致大量的表扫描所致。在进行优化后,如果还是不能达到要求,下面的公式可以帮助你计算使用几块硬盘可以满足这样的并发要求:
Raid 0 -- I/Os per disk = (reads +writes) / number of disks
Raid 1 -- I/Os per disk = [reads +(2 * writes)] / 2
Raid 5 -- I/Os per disk = [reads +(4 * writes)] / number of disks
Raid 10 -- I/Os per disk = [reads +(2 * writes)] / number of disks
我们得到的结果是:(320+400)/4=180,这时你可以根据公式①来得到磁盘的正常I/O值。假设现在正常I/O计数为125,为了达到这个结果:720/125=5.76。就是说要用6块磁盘才能达到这样的要求。
但是上面的Disk Reads/sec和Disk Writes/sec是个很难正确估算的值。因此只能在系统比较忙时,大概估算一个平均值,作为计算公式的依据。另一个是你很难从客户那里得到Seek time、 Rotational latency参数的值,这也只能用理论值125进行计算。