使用效能監控器找出SQLServer硬體瓶頸
開始SQLServer效能調優的最佳地方就是從效能監控器(系統監視器)開始。通過一個24小時的周期對一些關鍵的計數器進行監控,你將對你SQLServer伺服器的硬體瓶頸了如指掌。
一般來說,使用效能監控器去建立一個一些關鍵的計數器的24小時周期的監控日誌。當你決定建立這個日誌的時候,你需要選擇一個典型的24小時的周期,例如,選擇一個典型的比較忙的日期,而不是周日或節假日。
一旦你將這些捕獲的資料形成日誌後,在效能監控器的圖形介面下會顯示計數器的推薦值。你在上表中記下均值、最小值、峰值。做完這些後,用你的結果跟下面的分析比較。通過你的結果和下面的建議值進行比較,你將能快速的找到你的SQLServe正在經曆的潛在的硬體瓶頸。
關鍵效能計數器說明
下面是不同關鍵效能計數器的一個討論,它們的建議值和為了協助解決硬體瓶頸問題的一些選項。注意我已經限制了效能監控器需要監視的一些關鍵計數器。我這麼做是因為在本文我們的目的是為了容易的找到顯而易見的效能問題,許多其他的效能監控器計數器你能在本網站其他地方找到。
Memory: Pages/sec
這個計數器記錄的是每秒鐘記憶體和磁碟之間交換的頁面數。交換更多的頁面、超過你伺服器承受的更多的I/O,將輪流降低你SQLserver的效能。你的目的就是盡量將頁面減少到最小,而不是消除它。
如果你的伺服器上SQLServer是最主要的應用程式,那麼這個值的理想範圍是0~20之間。可能很多時候你看到的值都會超過20。這個值一般要保持在每秒的平均頁數在20以下。
如果這個值平均總是超過20,其中最大的一個可能是記憶體瓶頸問題,需要增加記憶體。通常來說,更多的記憶體意味著需要執行的頁面更少。
在大多數情況下,伺服器決定SQLServer使用的適當記憶體的大小,頁面將平均小於20。給SQLServer適當的記憶體意味著伺服器的快取命中率(Buffer Hit Cache Ratio 這個稍後會講到)達到99%或者更高。如果在一個24小時的周期裡你的sqlserver的快取命中率達到99%或者更高,但是在這個期間你的頁面數總是超過20,這意味著你或許運行了其他的程式。如果是這樣的情況,建議你移除這些程式,使SQLServer是你的伺服器的最主要的程式。
如果你的sqlserver伺服器沒有運行其他程式,並且在一個24小時的周期裡頁面數總是超過20,這說明你應該修改你對SQLServer的記憶體設定了。將其設定為“動態配置SQLServer的記憶體”,並且最大記憶體設定得高一些。為了達到最優,SQLServer將儘可能的獲得多的記憶體以完成自己的工作,而不是去和其他的程式爭奪記憶體。
Memory: Available Bytes
另一個檢查SQLServer是否有足夠的實體記憶體的方法是檢查Memory Object: Available Bytes計數器。 這個值至少大於5M,否則需要添加更多的實體記憶體。在一個專門的SQLServer伺服器上,SQLServer試圖維持4-10M的自由實體記憶體,其餘的實體記憶體被作業系統和SQLServer使用。當可用的實體記憶體接近5M或者更低時,SQLServer最可能因為缺少記憶體而遇到效能瓶頸。遇此情況,你需要增加實體記憶體以減少伺服器的負荷,或者給SQLServer配置一個合適的記憶體。
Physical Disk: % Disk Time
這個計數器度量磁碟陣列繁忙程度(不是邏輯分區或磁碟陣列上獨立的磁碟)。它提供一個對磁碟陣列繁忙程度相對較好的度量。原則上計數器% Disk Time的值應該小於55%。如果持續超過55%(在你24小時的監控周期裡大約超過10分鐘),說明你的SQLServer有I/O瓶頸。如果你只是偶爾看到,也不必太擔心。但是,如果經常發生的話(也就是說,一個小時出現好幾次),就應該著手尋找增加伺服器I/O效能或者減少伺服器負荷的解決之道了。一般是為磁碟陣列增加磁碟,或者更好更快的磁碟,或者給控制器卡增加緩衝,或者使用不同版本的RAID,或者更換更快的控制器。
在NT4.0上使用該計數器之前,確認在NT命令提示字元下輸入diskperf -y,重啟伺服器,以便手動開啟。在NT4.0下第一次必須將該計數器開啟,Windows2000預設是開啟的。
Physical Disk: Avg. Disk Queue Length
除了觀察物理磁碟的% Disk Time計數器外,還可以用Avg. Disk Queue Length計數器。磁碟陣列中的各個磁碟的該值如果超過2(在你24小時的監控周期裡大約超過10分鐘),那麼你的磁碟陣列存在I/O瓶頸問題。象計數器% Disk Time一樣,如果只是偶爾看到,也不必太擔心。但是,如果經常發生的話,就應該著手尋找增加伺服器I/O效能的解決之道了。如前所述。
你需要計算這個值,因為效能監控器不知道你的磁碟陣列中有多少物理磁碟。例如,如果你有一個6個物理磁碟組成的磁碟陣列,它的Avg.
Disk Queue Length值為10,那麼實際每個磁碟的值為1.66(10/6=1.66),它們都在建議值2以內。
在NT4.0上使用該計數器之前,確認在NT命令提示字元下輸入diskperf -y,重啟伺服器,以便手動開啟。在NT4.0下第一次必須將該計數器開啟,Windows2000預設是開啟的。
一起使用這兩個計數器將協助你找出I/O瓶頸。例如,如果% Disk Time的值超過55%,Avg. Disk Queue Length計數器值超過2,伺服器則存在I/O瓶頸。
Processor: % Processor Time
處理器對象: % Processor Time計數器對每一個CPU可用,並針對每一個CPU進行檢測。同樣對於所有的CPU也可用。這是一個觀察CPU利用率的關鍵計數器。如果% Total Processor Time計數器的值持續超過80%(在你24小時的監控周期裡大約超過10分鐘),說明CPU存在瓶頸問題。如果只是偶爾發生,並且你認為對你的伺服器影響不大,那沒問題。如果經常發生,你應該減少伺服器的負載,更換更高頻率的CPU,或者增加CPU的數量或者增加CPU的2級緩衝(L2 cache)。
System: Processor Queue Length
根據% Processor Time計數器,你可以監控Processor Queue Length計數器。每個CPU的該值如果持續超過2(在你24小時的監控周期裡大約超過10分鐘),那麼你的CPU存在瓶頸問題。例如,如果你的伺服器有4個CPU,Processor Queue Length計數器的值總共不應超過8。
如果Processor Queue Length計數器的值有規律的超過建議的最大值,但是CPU利用率相對不是很高,那麼考慮減少SQLServer的"max worker threads"的配置值。Processor Queue Length計數器的值高的可能原因是有太多的背景工作執行緒等待處理。通過減少"maximum worker threads"的值,強迫線程池踢掉某些線程,從而使線程池得到最大的利用。
一起使用計數器Processor Queue Length和計數器% Total Process Time,你可以找到CPU瓶頸,如果都顯示超過它們的建議值,可以確信存在CPU瓶頸問題。
SQL Server Buffer: Buffer Cache Hit Ratio
SQL Server Buffer中的計數器Buffer Cache Hit Ratio用來指出SQLServer從緩衝中而不是磁碟中獲得資料的頻率。在一個OLTP程式中,該比率應該超過90%,理想值是超過99%。如果你的buffer cache hit ratio低於90%,你需要立即增加記憶體。如果該比率在90%和99%之間,你應該認真考慮購買更多的記憶體了。如果接近99%,你的SQLServer效能是比較快的了。某些情況下,如果你的資料庫非常大,你不可能達到99%,即使你在伺服器上配置了最大的記憶體。你所能做的就是儘可能的添加記憶體。
在OLAP程式中,由於其本身的工作原理,該比率大大減少。不管怎樣,更多的記憶體總是能提高SQLServer的效能。
SQL Server General: User Connections
既然sqlserver的使用人數會影響它的效能,你就需要專註於sqlserver的General Statistics Object: User Connections計數器。它顯示sqlserver目前串連的數量,而不是使用者數。
如果該計數器超過255,那麼你需要將sqlserver的"Maximum Worker Threads" 的配置值設定得比預設值255高。如果串連的數量超過可用的線程數,那麼sqlserver將共用線程,這樣會影響效能。"Maximum Worker Threads"需要設定得比你伺服器曾經達到的最大串連數更高。