【轉載】SQL Server性能調教系列(2)--Server Performance Monitor(Perfmon)

 

性能監視的工具有很多,首先介紹Microsoft Windows Server自帶的Performance Monitor. Windows性能監視器是一個很好用的工具,可以實時檢查運行程序影響計算機性能的方式(CPU,ROM,IO等),並通過收集日誌數據供以後分析使用. 通過性能監視能瞭解系統loading以及這種loading對系統資源的影響, 分析性能或者資源使用率的變化趨勢, 有效的對系統做出調整, 優化或者升級. 診斷系統故障或確定優化的組件或升級的步驟, 也可以找出性能瓶頸


Performance Monitor是一個系統內置的MMC控制檯: 包括系統監視器(System Monitor)和性能日誌和警報(Performance Logs and Alerts)兩個部分. 通過實時和日誌的方式來記錄服務器性能. 使用系統監視器可以取現, 曲方圖或者報表的方式實時查看內存, 硬盤, 處理器, 網絡等各種對象的性能數據. 使用性能日誌也警報可以對計數器日誌進行配置, 記錄性能數據, 設置性能警報, 通過設定性能警報, 可以使系統在某一特定的計數器值低於或高於指定的值時及時通知系統管理員.

 

 下面簡單介紹Windows Server 2003下的Performance Monitor, 通過日誌記錄性能數據, 之後分析.

1. 打開:Administrative Tools->Performance, 

                 或SQL Server Profiler->Tools->Performance Monitor,

      或在運行中輸入"perfmon"

2.重要的性能計數器

(1). Processor

(2). PhysicalDisk

(3). Memory

(4). Network Interface

(5). SQL Server Access Methods

(6). SQL Server: SQL Statistics

(7). SQL Server: Databases

(8). SQL Server General Statistics

(9). SQL Server Locks

(10). SQL Server Buffer Manager


下表對重要的性能計數器做一個簡要的說明:

 

 

 




 

 
性能計數器:    
Performance Object Counter Description
Processor %processor Time 指處理器執行非閒置線程時間的百分比,測量處理器繁忙的時間 這個計數器設計成用來作爲處理器活動的主要指示器,可以選擇單個CPU實例,也可以選擇Total
Interrupts/sec 處理器正在處理的來自應用程序或硬件的中斷的數量
     
PhysicalDisk % Disk Time
計數器監視磁盤忙於讀/寫活動所用時間的百分比.在系統監視器中,PhysicalDisk: % Disk Time 計數器監視磁盤忙於讀/寫活動所用時間的百分比。如果 PhysicalDisk: % Disk Time 計數器的值較高(大於 90%),請檢查 PhysicalDisk: Current Disk Queue Length 計數器瞭解等待進行磁盤訪問的系統請求數量。等待 I/O 請求的數量應該保持在不超過組成物理磁盤的軸數的 1.5 到 2 倍。大多數磁盤只有一個軸,但獨立磁盤冗餘陣列 (RAID) 設 備通常有多個軸。硬件 RAID 設備在系統監視器中顯示爲一個物理磁盤。通過軟件創建的多個 RAID 設備在系統監視器中顯示爲多個實例。
可以使用 Current Disk Queue Length 和 % Disk Time 計數器的值檢測磁盤子系統中的瓶頸。如果 Current Disk Queue Length 和 % Disk Time 計數器的值一直很高,則考慮下列事項:
1.使用速度更快的磁盤驅動器。
2.將某些文件移至其他磁盤或服務器。
3.如果正在使用一個 RAID 陣列,則在該陣列中添加磁盤。
計數器監視磁盤忙於讀/寫活動所用時間的百分比.在系統監視器中,PhysicalDisk: % Disk Time 計數器監視磁盤忙於讀/寫活動所用時間的百分比。
如果 PhysicalDisk: % Disk Time 計數器的值較高(大於 90%),請檢查 PhysicalDisk: Current Disk Queue Length 計數器瞭解等待進行磁
盤訪問的系統請求數量。等待 I/O 請求的數量應該保持在不超過組成物理磁盤的軸數的 1.5 到 2 倍。大多數磁盤只有一個軸,但獨立磁盤冗餘陣列
(RAID) 設備通常有多個軸。硬件 RAID 設備在系統監視器中顯示爲一個物理磁盤。通過軟件創建的多個 RAID 設備在系統監視器中顯示爲多個實例。
可以使用 Current Disk Queue Length 和 % Disk Time 計數器的值檢測磁盤子系統中的瓶頸。如果 Current Disk Queue Length 和 % Disk Time 計數器的值一直很高,則考慮下列事項:
1.使用速度更快的磁盤驅動器。
2.將某些文件移至其他磁盤或服務器。
3.如果正在使用一個 RAID 陣列,則在該陣列中添加磁盤。
Avg.Disk Queue Length 指讀取和寫入請求(爲所選磁盤在實例間隔中列隊的)的平均數
Current Disk Queue Length 指示被掛起的磁盤 I/O 請求的數量。如果這個值始終高於 2, 就表示產生了擁塞
Avg.Disk Bytes/Transfer 寫入或讀取操作時向磁盤傳送或從磁盤傳出字節的平均數
Disk Bytes/sec 在讀寫操作中,從磁盤傳出或傳送到磁盤的字節速率
     
Memory Pages/sec 被請求頁面的數量.
Available Bytes 可用物理內存的數量
Committed Bytes 已分配給物理 RAM 用於存儲或分配給頁面文件的虛擬內存
Pool Nonpaged Bytes 未分頁池系統內存區域中的 RAM 數量
Page Faults/sec 是每秒鐘出錯頁面的平均數量
     
Network Interface Bytes Received/sec 使用本網絡適配器接收的字節數
Bytes Sent/sec 使用本網絡適配器發送的字節數
Bytes Total/sec 使用本網絡適配器發送和接收的字節數
Server Bytes Received/sec 把此計數器與網絡適配器的總帶寬相比較,確定網絡連接是否產生瓶頸
     
SQL Server Access Methods Page Splits/sec 每秒由於索引頁溢出而發生的頁拆分數.如果發現頁分裂的次數很多,考慮提高Index的填充因子.數據頁將會有更多的空間保留用於做數據的填充,從而減少頁拆分
Pages Allocated/sec 在此 SQL Server 實例的所有數據庫中每秒分配的頁數。這些頁包括從混合區和統一區中分配的頁
Full Scans/sec 每秒不受限制的完全掃描數. 這些掃描可以是基表掃描,也可以是全文索引掃描
     
SQL Server: SQL Statistics Batch Requests/Sec 每秒收到的 Transact-SQL 命令批數。這一統計信息受所有約束(如 I/O、用戶數、高速緩存大小、請求的複雜程度等)影響。
批處理請求數值高意味着吞吐量
SQL Compilations/Sec 每秒的編譯數。表示編譯代碼路徑被進入的次數。包括 SQL Server 中語句級重新編譯導致的編譯。當 SQL Server 用戶活動穩定後,
該值將達到穩定狀態
Re-Compilations/Sec 每秒語句重新編譯的次數。計算語句重新編譯被觸發的次數。一般來說,這個數最好較小,存儲過程在理想情況下應該只編譯一次,
然後執行計劃被重複使用. 如果該計數器的值較高,或許需要換個方式編寫存儲過程,從而減少重編譯的次數
     
SQL Server: Databases Log Flushes/sec 每秒日誌刷新數目
Active Transactions 數據庫的活動事務數
Backup/Restore Throughput/sec 每秒數據庫的備份和還原操作的讀取/寫入吞吐量。例如,並行使用多個備份設備或使用更快的設備時,可以測量數據庫備份操作性能的變化情況。
數據庫的備份或還原操作的吞吐量可以確定備份和還原操作的進程和性能
     
SQL Server General Statistics User Connections 系統中活動的SQL連接數. 該計數器的信息可以用於找出系統的最大併發用戶數
Temp Tables Creation Rate 每秒創建的臨時表/表變量的數目
Temp Tables For Destruction 等待被清除系統線程破壞的臨時表/表變量數
     

SQL Server Locks
Number of Deadlocks/sec 指每秒導致死鎖的鎖請求數. 死鎖對於應用程序的可伸縮性非常有害, 並且會導致惡劣的用戶體驗. 該計數器必須爲0
Average Wait Time (ms) 每個導致等待的鎖請求的平均等待時間
Lock requests/sec 鎖管理器每秒請求的新鎖和鎖轉換數. 通過優化查詢來減少讀取次數, 可以減少該計數器的值
     
SQL Server:Memory Manager Total Server Memory (KB) 從緩衝池提交的內存(這不是 SQL Server 使用的總內存)
Target Server Memory (KB) 服務器能夠使用的動態內存總量
SQL Cache Memory(KB) 服務器正在用於動態 SQL 高速緩存的動態內存總數
Memory Grants Pending 指每秒等待工作空間內存授權的進程數. 該計數器應該儘可能接近0,否則預示可能存在着內存瓶頸
     
SQL Server Buffer Manager Buffer Cache Hit Ratio 緩存命中率,在緩衝區高速緩存中找到而不需要從磁盤中讀取(物理I/O)的頁的百分比. 如果該值較低則可能存在內存不足或不正確的索引
Page Reads/sec 每秒發出的物理數據庫頁讀取數。此統計信息顯示的是所有數據庫間的物理頁讀取總數。由於物理 I/O 的開銷大,可以通過使用更大的數據緩存、智能索引、更有效的查詢或更改數據庫設計等方法,將開銷降到最低
Page Writes/sec 每秒執行的物理數據庫頁寫入數
Page Life Expectancy 頁若不被引用將在緩衝池中停留的秒數
Lazy Writes/Sec 每秒被緩衝區管理器的惰性編寫器寫入的緩衝區數
Checkpoint Pages/Sec 由要求刷新所有髒頁的檢查點或其他操作每秒刷新到磁盤的頁數
     


提示:

當監視Windows Server或SQL Server以調查與性能有關的問題時,請首選關注一下硬件的三方面:

(1) CPU(處理器使用率)

(2) RAM(內存使用率)

(3) HDD(磁盤活動即IO)

 

3.建立監視

下面要建立監視(我監視的HP Server配置爲:Intel 4x4 x 3.0 GHz/RAM 16.0G,業務系統爲OLTP).

(1) 在performance->Performance Logs and Alerts->New Log Setting...

(2) General Tab->Add Counters,添加需要監測的計數器(可參考如上的計數器列表)

(3) General Tab->Interval,設置監測的時間間隔(默認是15s)

(4) Log Files Tab->Log file type,選擇Log File保存的方式(text File,Binary File,SQL Database),這裏我選擇text File(Tab delimited).

(5) Schedule Tab,設置監測的開始時間及結束時間.

 

4.分析(我做測試監測的時間段(2010/7/7 10:30-23:59))

在監測一段時間之後,你就會得到Server重要的性能計數器信息,接下來就可以分析Server的性能. 我是藉助數據透視圖來做的,看起來會比較直觀.

 

4.1 CPU使用率.分析%Processor Time(_Total)(所用時間的百分比,橫軸取時間,豎軸取%Processor Time)

如下圖在2010/7/7 10:30-12:40和2010/7/7 16:44-18:48這兩段時間內CPU的使用率很高基本上都在50%以上.尤其在17:00-17:12,17:53-18:00CPU很繁忙,在這段時間會有大量的事務需要處理(T-SQL查詢,SP,後臺job, User操作等等).

 

如果CUP使用率一直居高不下(持續80%到90%的狀態),就要考慮升級CPU, 增加更多的處理器或者系統調優(建議先做系統調優,升級硬件需要增加額外的成本).


 

 

4.2 磁盤I/O(%Disk Time,磁盤忙於讀/寫活動所用時間的百分比)

監視磁盤活動涉及到兩個主要方面:

(1)監視磁盤I/O及檢測是否有過度換頁

(2)隔離SQL Server產生的磁盤活動


從做的數據透視圖來看,磁盤I/O的讀寫很清閒,只在11:58,15:00,18:00,23:45左右(圖上沒有截出來)會有較大的IO.

 

如果磁盤I/O很高(>90%),則考慮更換快速磁盤(如固態硬盤等).

 

 

 

請參考微軟給出的解決方案:

 

 

4.3 緩存命中率(Buffer Cache Hit Ratio)

根據檢測的數據來看,緩存命中率基本上在99.99%-100%之間,表示數據緩存幾乎滿足所有的數據請求.

 

4.4 頁拆分(Page Splits/sec,每秒由於索引頁益處而發生的頁拆分數)

如果頁拆分很頻繁,可以考慮增加填充因子(我設置的Index fill factor爲85,也就是每個頁會留有15%的空間做數據填充).

從我做的檢測來看,只有在很少的時間段內會有較大的頁拆分,此時可能會有大量的數據事務操作.總體來看性能還好.

 

 

 

4.5 每秒日誌刷新數目(Log Flushes/sec)

日誌刷新發生在當transaction提交, 數據從日誌緩存寫入磁盤日誌文件時. 應該儘可能的減少日誌刷新.

如果檢測到數值一直很高的話,說明transaction非常活躍,就要減少transaction數.

 

這裏有一個簡單的示例來說明:

比如說要向Table中Insert 1w條數據

做法1: 一條一條的Insert,一個transaction一條. 會產生1w個log flushes

做法2: 1w條數據在一個transaction Insert.只產生1個log flushes

 

明顯的第二種產生的日誌刷新會大大減少,相應的磁盤I/O也大大減少.從而有助於提高性能.

 

 

 

總結:

(1). 還有很多的日誌記錄沒有做一一的簡單分析.

(2). Performance Monitor只是提供一個方法來幫助發現問題,提供一個性能優化的方向. 一旦影響性能的問題找到了,就可以從這個方向來着手處理.

(3). 網上有很多性能檢測的工具,大抵應該是把如上所做的工作封裝起來,並且UI上面已經分析好,更加的直觀.

(4). 如果寫的有不當之處,歡迎指出指正,謝謝!

 

原載地址:http://www.cnblogs.com/changbluesky/archive/2010/07/12/1771210.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章