通常,我們很容易觀察到資料庫伺服器的記憶體和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. Disk Queue Length 12
Avg. Disk Sec/Read .035
Avg. Disk Sec/Write .045
Disk Reads/sec 320
Disk Writes/sec 100
Avg. Disk Queue Length,12/4=3,每塊磁碟的平均隊列建議不超過2。
Avg. Disk Sec/Read一般不要超過11~15ms。
Avg. Disk Sec/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進行計算。