通常,我們很容易觀察到數據庫服務器的內存和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性能對象的部分值:
從上面的結果,我們看到磁盤本身的I/O能力是滿足我們的要求的,原因是因為有大量的請求才導致隊列等待,這很可能是因為你的SQL語句導致大量的表掃描所致。在進行優化后,如果還是不能達到要求,下面的公式可以幫助你計算使用幾塊硬盤可以滿足這樣的并發要求:
我們得到的結果是:(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進行計算。
如何通過Performance Log確定SQL的磁盤有性能問題?
1. 查看Disk Bytes/sec. 舉個例子, 這個counter的最大值如果是11M, 那么說明work load并不高.
2. 查看Avg. Disk sec/Transfer. 舉例, 這個counter的推薦值是<0.015.
3. 查看Avg. Disk Queue Length, 這個推薦值是<2.
一些比較重要的performance counter:
Counter | Description |
LogicalDisk/ % Free Space | 報告磁盤空間中未被分配的空間占邏輯卷中總可用空間的百分比. 當選擇_Total實例的時候, 該計數器會重新計算每個盤總和. PhysicalDisk對象沒有這個計數器. |
LogicalDisk|PhysicalDisk/ Avg. Disk Bytes/Transfer | 衡量輸入/輸出(I/O)操作的數據量的大小. 如果磁盤相對快速地傳輸大量數據, 那么磁盤是高效的. 當衡量最大吞吐量的時候, 應該觀察這個計數器. 要進一步地分析數據傳輸, 應當查看Avg. Disk Bytes/Read 和Avg. Disk Bytes/Write兩個計數器. |
LogicalDisk|PhysicalDisk/ Avg. Disk sec/Transfer | 標示著數據被移動的速度(以秒衡量). 衡量每次數據傳輸的平均時間, 而不論讀或寫的數據的大小. 它展示了從數據離開Diskperf.sys, 到操作完成的讀或寫的總時間. 這個計數器的高數值可能意味著系統因為隊列太長而在重試請求, 或者由于不常見地磁盤錯誤而重試請求. 要進一步地分析數據傳輸, 應當查看Avg. Disk sec/Read 和Avg. Disk sec/Write兩個計數器. |
LogicalDisk|PhysicalDisk/ Avg. Disk Queue Length | 記錄了在計數器數據采樣點之間的時間內被放入隊列中等待磁盤的請求的數量, 也包括正在被處理的請求在內. 所以, 這有可能是有點夸大的數據. 如果有多于兩個的請求持續地在一個單磁盤的系統中等待, 那么磁盤可能就是瓶頸. 要進一步地分析隊列長度的數據, 應當查看Avg. Disk Read Queue Length 和Avg. Disk Write Queue Length兩個計數器. |
LogicalDisk|PhysicalDisk/ Current Disk Queue Length | 標示著當前正在等待的磁盤請求的數量, 也包括正在被處理的請求. 受許多因素的影響, 除非工作量的狀態比較穩定, 并且你收集了充足的采樣, 才能建立一個模式. 這是一個即刻的數值或是當前隊列的長度, 跟Avg. Disk Queue Length, Avg. Disk Read Queue Length, 和Avg. Disk Write Queue Length不一樣, 那三個反應的是平均值. |
LogicalDisk|PhysicalDisk/ Disk Bytes/sec | 標示著字節被傳輸的速率, 該計數器是磁盤吞吐量的主要衡量指標. 要進一步地分析讀或寫的傳輸的數據, 應當分別查看Disk Read Bytes/sec 或Disk Write Bytes/sec兩計數器. |
LogicalDisk|PhysicalDisk/ Disk Transfers/sec | 標示著每秒鐘完成的讀和寫操作數, 而不論這些讀寫操作涉及到多少數據. 該計數器衡量磁盤的利用率. 如果該值超過50(如果是striped的分卷, 那就是看平均到每塊物理磁盤上), 那么這可能就是一個瓶頸了. 要進一步地分析讀或寫的數據傳輸, 應當分別查看Disk Read/sec 和Disk Writes/sec |
LogicalDisk/ Free Megabytes | 匯報磁盤上沒被分配的字節的量. PhysicalDisk對象上, 沒有這個計數器. |
LogicalDisk|PhysicalDisk/ Split IO/sec | 匯報操作系統將I/O請求分為多個磁盤請求的比率. 如果一個程序請求的數據大小太大, 以至于不能放在一個單個請求中, 或是磁盤有碎片, 那么一個split I/O請求可能會發生. 影響IO請求大小的因素可以包括應用程序設計, 文件系統, 驅動程序. 高比率的split I/O可能本身不會作為一個問題出現. 然而, 在單磁盤系統中, 這個計數器的高數值趨向于標志著磁盤碎片. |
LogicalDisk|PhysicalDisk/ % Disk Time | 報告選擇的磁盤驅動器忙于服務讀寫請求的時間比率. 因為這個計數器的數據會跨越多個采樣, 持續地夸大磁盤利用率, 那這個值跟%Idle Time比較, 這樣能獲得更清晰的認識. 默認這個計數器的值不會超過100%的. |
LogicalDisk|PhysicalDisk/ % Disk Write Time | 匯報被選擇的磁盤忙于處理寫請求所占的時間的百分比. |
LogicalDisk|PhysicalDisk/ % Disk Read Time | 匯報被選擇的磁盤忙于處理讀請求所占的時間的百分比. |
LogicalDisk|PhysicalDisk/ % Idle Time | 匯報磁盤系統沒在處理任何請求, 而且沒有任何工作在隊列中的時間的百分比. 注意這個計數器和%Disk Time相加的時候可能結果不是100%, 因為%Disk Time可能會夸打磁盤的利用率. |
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。
新聞熱點
疑難解答