效能監控的工具有很多,首先介紹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 |
每秒資料庫的備份與還原操作的讀取/寫入輸送量。例如,並行使用多個備份裝置或使用更快的裝置時,可以測量Database Backup操作效能的變化情況。 資料庫的備份或還原作業的輸送量可以確定備份與還原操作的進程和效能 |
|
|
|
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%),則考慮更換快速磁碟(如固態硬碟等).
請參考微軟給出的解決方案:
監視磁碟 I/O 及檢測過度換頁
可以對下面兩個計數器進行監視以確定磁碟活動:
- PhysicalDisk: % Disk Time
- PhysicalDisk: Avg. Disk Queue Length
在系統監視器中,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 計數器的值一直很高,則考慮下列事項:
- 使用速度更快的磁碟機。
- 將某些檔案移至其他磁碟或伺服器。
- 如果正在使用一個 RAID 陣列,則在該陣列中添加磁碟。
如果使用 RAID 裝置,% Disk Time 計數器會指示大於 100% 的值。如果出現這種情況,則使用 PhysicalDisk: Avg.Disk Queue Length 計數器來確定等待進行磁碟訪問的平均系統請求數量。
I/O 依賴的應用程式或系統可能會使磁碟持續處於活動狀態。
監視 Memory: Page Faults/sec 計數器可以確保磁碟活動不是由分頁導致的。在 Windows 中,換頁的原因包括:
如果在同一硬碟上有多個邏輯分區,請使用 Logical Disk 計數器而非 Physical Disk 計數器。查看邏輯磁碟計數器有助於確定哪些檔案被頻繁訪問。當發現磁碟有大量讀/寫活動時,請查看讀寫專用計數器以確定導致每個邏輯卷負荷增加的磁碟活動類型,例如,Logical Disk: Disk Write Bytes/sec。
隔離 SQL Server 產生的磁碟活動
可以進行監視以確定由 SQL Server 元件產生的 I/O 活動量的兩個計數器為:
- SQL Server:Buffer Manager:Page reads/sec
- SQL Server:Buffer Manager:Page writes/sec
在系統監視器中,這些計數器通過檢查以下操作的效能監控由 SQL Server 元件產生的 I/O 活動量。
如果這些計數器的值達到硬體 I/O 子系統的容量限制,則需要減小這些值,方法是調整應用程式或資料庫以減少 I/O 操作(如索引覆蓋、索引最佳化或正常化),增加硬體的 I/O 容量或添加記憶體
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上面已經分析好,更加的直觀.