在寫這篇東西的時候我也不是很清楚性能基線,到底要檢查點什麼,dmv要不要檢查,perfmon要檢測那先。
是以我決定,對我發的《sql server 性能調優》文章内的 perfmon和dmv做一個總結。來建立自己的性能基線。
在io中我們要注意哪些性能名額呢?
1. physical disk\disk reads/sec
--這個應該很清楚 一看就就知道 這個名額是指什麼的
2. physical
disk\ disk writes/sec
一打開文章就看到這2個值,而卻有閥值,看到閥值很開心,因為不用你去收集值了。
• Less than 10 ms = good performance
• Between 10 ms and 20 ms = slow
performance
• Between 20 ms and 50 ms = poor
• Greater than 50 ms = significant
performance problem.
接下來就是 sys.dm_os_wait_stats
中的幾個wait type
3. PAGEIOLATCH_*
PAGEIOLATCH_* 系列的wait type 一共有
PAGEIOLATCH_DT -- 破壞,什麼是破壞,就是把記憶體中資料頁釋放掉
PAGEIOLATCH_EX -- x鎖,可以怎麼了解,就是排他占用這個鎖
PAGEIOLATCH_KP -- 保持,就是保持這個頁不被破壞
PAGEIOLATCH_NL -- 沒有定義,保留
PAGEIOLATCH_SH -- 在讀,資料頁的時候就配置設定這個闩
PAGEIOLATCH_UP -- 在更新的時候配置設定這個
根據onlinebook的解釋:在任務等待 I/O 請求中緩沖區的闩鎖時發生。闩鎖請求處于“XX”模式。長時間的等待可能訓示磁盤子系統出現問題。
講的直白一點就是系統在io,入讀或寫的時候配置設定的。等待io請求
4. ASYNC_IO_COMPLETION
根據onlinebook的解釋:當某任務正在等待 I/O 完成時出現
這個是等待異步io完成,那麼和上面有沒有關系呢?答案是沒有,上面等待的是io讀取出來,或者寫入。這個是等待系統的異步io完成是不一樣的概念。
5. IO_COMPLETION
根據onlinebook的解釋:在等待 I/O 操作完成時出現。通常,該等待類型表示非資料頁 I/O。資料頁 I/O 完成等待顯示為 PAGEIOLATCH_* waits。
這個就不解釋了說的很明白了就是等待非資料頁的io完成
6. WRITELOG
根據onlinebook的解釋:等待日志重新整理完成時出現。導緻日志重新整理的常見操作是檢查點和事務送出。
這個也不多解釋,就是寫入日志時候等待的時間。
7.Processor/ %Privileged Time
--核心級别的cpu使用率
8.Processor/ %User Time
--使用者幾倍的cpu使用率
9.Process (sqlservr.exe)/ %Processor
Time --某個程序的cpu使用率
10.SQLServer:SQL Statistics/Auto-Param Attempts/sec --試圖運作自動參數化次數
11. SQLServer:SQL
Statistics/Failed Auto-params/sec
-- 自動參數化失敗
12. SQLServer:SQL
Statistics/Batch Requests/sec -- 批處理量
13. SQLServer:SQL
Statistics/SQL Compilations/sec -- 編譯次數
14. SQLServer:SQL
Statistics/SQL Re-Compilations/sec -- 反編譯次數
15. SQLServer:Plan
Cache/Cache hit Ratio
-- 執行計劃,cache命中率
接下來還是 wait event的
16.signal_wait_time_ms --從發出信号到開始運作的時間差,時間花費在等待運作隊列中,是單純的cpu等待。
下面代碼量化的像是signal_wait_time_ms占的比重
SELECT SUM(signal_wait_time_ms) AS TotalSignalWaitTime ,
( SUM(CAST(signal_wait_time_ms AS NUMERIC(20, 2)))
/ SUM(CAST(wait_time_ms AS NUMERIC(20, 2))) * 100 )
AS PercentageSignalWaitsOfTotalTime
FROM sys.dm_os_wait_stats
在建立baseline 的時候 完全可以 按這個sql來擷取值。
17.SOS_SCHEDULER_YIELD等待
onlinebook的解釋:在任務自願為要執行的其他任務生成計劃程式時出現。在該等待期間任務正在等待其量程更新。
完全看不懂,啥叫量程。
直白的說就是:當查詢自動放棄cpu,并且等待恢複執行,這個等待就叫做SOS_SCHEDULER_YIELD。
18.CXPACKET等待
onlinebook:當嘗試同步查詢處理器交換疊代器時出現。如果針對該等待類型的争用成為問題時,可以考慮降低并行度。
直白點就是:處理器之間的一種同步,一般出現在 并發查詢,為啥?因為隻有并發查詢才用多個處理器。
接下來是 sys.dm_os_schedulers
SELECT scheduler_id ,
current_tasks_count ,
runnable_tasks_count
FROM sys.dm_os_schedulers
WHERE scheduler_id < 255
19.主要是查每個處理器上的任務數和可運作的任務數。
20.SQL
Server :Buffer Manager
又很多有用的計數器都是這 buffer manager 對象下面,可以幫助發現buffer pool滾筒的問題。
21.buffer
cache hit ratio
buffer cache hit ratio一般情況下在oltp中要高于95%,在olap中要高于90%。可惜的是沒有關于這個性能名額相關的解釋,和這個值是如何影響預讀機制的。如果這個名額的值有巨大的下降那麼就說明有問題。這個不能說明記憶體壓力和sql server 健康指數。
22.page life
expectancy
page life expectancy是頁生命周期,也就是一個資料頁在記憶體中的時間。在以前sql server 2000 4g的記憶體已經很大了,sql server buffer
pool的大小是1.6g,如果sql server 從磁盤上讀取1.6g的資料也隻要5分鐘,但是今天64g的記憶體是主流,如果從磁盤一下子讀取50g的記憶體,會嚴重的沖擊io。當存在大量的查詢掃描表,讀入新的資料頁,導緻生命周期值下降也不是不正常的。這個值必須長期的監視來分析問題。
23.Free
Pages
free pages是記憶體中空頁的數量,不要接近于0。這個值說明查詢能否在其他查詢不是放記憶體的情況下,快速的配置設定記憶體的主要依據。如果free pages 很少,頁生命周期很短,并且伴随着空頁争用(free list
stalls/sec)的情況那麼很有可能導緻記憶體壓力。
24.Free list
stalls/sec
Free list stalls/sec每秒空頁等待的數量,如果一段時間内都在0以上那麼說明可能存在記憶體壓力。
25.lazy
write/sec
lazy write/sec 就是每秒寫入磁盤的次數。如果發生量很大并且生命周期很短,free page 很少,但是 free list stall/sec 量很大,那麼就是發生記憶體壓力了。
SQL Server:memory Manager
SQL Server:memory
Manager對象内對記憶體的消費和記憶體管理的問題提供了很重要參考
26.total server memory 和 target server memory
這2個計數器代表了目前sql server 使用的總共記憶體和sql server 想要用的記憶體。如果 target server memory超過了total server memory,也是記憶體壓力的重要标志。sql server 會減少記憶體的需求來接近服務的可用記憶體,或者通過最大伺服器記憶體配置,是以當記憶體出現壓力問題的時候不應該第一時間去檢視這2個計數器
28.memory
grants outstanding
該值是現實多少程序已經成功的擷取了記憶體的授權。在一段時間内,業務高峰期,如果該值過低,那麼标志可能存在記憶體壓力,特别是 memory grants pending 也比較高的情況下。
29. memory
grants pending
該值是有過少程序正在等待記憶體的授權。如果為非0,那麼說明需要調整或者優化負載或者增加記憶體。
每個需要跟蹤的東西我都簡單的解釋了一下。關于 wait event 是累計計數的,在計算的時候需要相減。
這樣跟蹤個一天,設定好頻率,就能得出性能基線了,可以做成圖示,這樣通過圖形就更容易看出問題了。