[SQL SERVER]SQL Server Perfmon Counters

[SQL SERVER]SQL Server Perfmon Counters

我自己常透過Performance Counter來檢視SQL Server相關效能水準是否如預期

錄製時間範圍我大概抓2~5個禮拜,也可以透過sys.dm_os_performance_counters 查看相關效能計數器

這篇來整理一下自己常用的SQL Server Perfmon Counters門檻值。

note:硬體部分可參考[SQL SERVER][Performance]找出硬體Bottleneck

 

名稱 建議值 說明

SQLServer: Buffer Manager: Buffer cache hit ratio

>95%
優:99.999%
從buffer讀取data page擊中率,該值越高表示資料都是從記憶體中讀取

SQLServer: Buffer Manager: Page life expectancy

>300
停留超過5分鐘
data page留在buffer的時間,停留時間越長,表示SQL Server不需要從disk讀取資料到memory,停留時間越短,表示Server可能需要增加記憶體

SQLServer: Buffer Manager: Checkpoint Pages / Sec

  將記憶體中的Dirty Page 和log page寫入disk,checkpoint頻率和 recovery interval設定有關聯,如果該值太高可能表示記憶體不足或是 recovery interval設定太高(預設0表示每分鐘處理)

SQL Server: Databases:Log Flushes/sec

  log page每秒寫入transaction log file頻率,該值太高可能是交易處理邏輯不良導致交易次數太高,如1000筆資料每一次commit該值就會增加1000,如果批次分成2個交易(每500筆commit)該值只會增加2

SQL Server: Databases:Log Growths

0 transaction log file被擴大次數,每一次當transaction log file被擴大時,所有使用者活動必須被停止,直到transaction log file成長完畢,這通常表示transaction log file空間沒有被reuse或是初始值設定不良所導致,要避免使用者請求處理期間被擴大影響效能
SQLServer: SQL Statistics: Batch Requests/Sec   每一秒處理請求的數量,該值通常和硬體等級有關,也通常表示SQL Server吞吐量,基本上透過該值需和其他值互相搭配參考。
SQLServer: SQL Statistics: SQL Compilations/Sec < Batch Requests/Sec *10% 每秒TSQL發生編譯次數(包含重新編譯),編譯是一個昂貴操作,基本上該值越低越好,越高可能 ad hoc查詢過多,或使用不必要的recompile提示,可能須適當改寫TSQL降低編譯次數。
SQLServer: SQL Statistics: SQL Re-Compilations/Sec <Compilations/Sec *10% 每秒發生重新編譯次數,該值應該要接近0,因為重新編譯可能導致deadlock和exclusive compile locks,該值需參考Batch Requests/Sec和SQL Compilations/Sec
SQLServer: Access Methods: Page Splits / Sec < 100 Batch Requests/Sec *20% 每秒發生頁面分割次數,頁面分割是昂貴操作,要減少頁面分割次數,需要查看資料表和索引設計,避免非順序資料新增或是針對高寫資料表調整索引填充因子。

SQLServer: General Statistic: Processes Block

  process blocked another process數量,理想情況下該值應該接近0,但實務上短暫封鎖是可接受的,如果該值太高你應該詳細調查是那些因素造成,以我個人經驗大多都是不良的平行處理所造成(參考SQL SERVER]找出封鎖的處理序)
SQLServer: Locks:

Lock Wait Time (ms)

<10 ms thread請求lock等待時間,該值過高可能是blocking、不必要的鎖定擴大或是TSQL不佳所造成,也有可能是I/O問題(硬碟壞一顆),透過 sys.dm_os_waiting_tasks 查看鎖定資源,調整TSQL、設計正確索引或是最小化鎖定(nolock)
SQLServer: Locks: Lock Waits / Sec 0 thread請求lock等待時間。
整體lock時間應該要越短越好,例如應該盡量縮短交易處理時間,避免大交易處理(可拆多個小交易)
SQLServer: Locks: Avg Wait Time (ms) <500 ms 每個lock請求等待時間,一般來說平均超過500ms表示有過多的封鎖,該值需參考Lock Waits/sec 取得一個平衡。
SQLServer: Locks: Deadlock/s <1 每秒死結次數,該值應該等於0,該值太高表示交易處理邏輯不良,或是沒有使用正確索引導致都是full scan,需重新調整邏輯處理或是改善TSQL效能。
SQL Server: Latches : Latch Waits/sec

(Total Latch Wait Time) / (Latch Waits/ Sec) < 10

該數值表示無法立即授予Latch的請求。

Latch是SQL Serve內部用來同步資源一種資料結構,和操作系統的read/write lock類似,Latch保護資源使得資料存取井然有序,例如說當某一個session取得某個資源latch獨佔時,其他session如果也需要該資源latch時,則必須等待該latch釋放才可存取。

大方向來說,latch分兩大類,一buffer latch、另一I/O latch,buffer latch一般<1 ms,I/O latch一般<10 ms。

note:PAGELATCH_SH wait for PFS or SGAM pages in tempdb,表示tempdb有嚴重的資源競爭,透過切割tempdb datafile和啟用TF1118可獲得改善(參考[SQL SERVER]了解制式範圍和混和範圍)

SQL Server: Latches : 

Avg Latch Wait Time (ms)

<1 ms 請求latch所等待時間。
SQL Server: Latches :

Total Latch Wait Time (ms)

(Total Latch Wait Time) / (Latch Waits/ Sec) < 10

該數值表示最後Latch請求的總等待時間,該值可提供其他計數器參考使用

 

 

 

參考

[SQL SERVER][Performance]找出硬體Bottleneck

SQL Server  Perfmon Counters

SQL Server Performance, Best Practices, & Productivity

Performance Counter Guidance

List of Perfmon counters for sql server