利用Performance Monitor實現(xiàn)SQL Server調(diào)優(yōu)
性能監(jiān)視的工具有很多,首先介紹Microsoft Windows Server自帶的Performance Monitor. Windows性能監(jiān)視器是一個很好用的工具,可以實時檢查運行程序影響計算機性能的方式(CPU,ROM,IO等),并通過收集日志數(shù)據(jù)供以后分析使用. 通過性能監(jiān)視能了解系統(tǒng)loading以及這種loading對系統(tǒng)資源的影響, 分析性能或者資源使用率的變化趨勢, 有效的對系統(tǒng)做出調(diào)整, 優(yōu)化或者升級. 診斷系統(tǒng)故障或確定優(yōu)化的組件或升級的步驟, 也可以找出性能瓶頸.
Performance Monitor是一個系統(tǒng)內(nèi)置的MMC控制臺: 包括系統(tǒng)監(jiān)視器(System Monitor)和性能日志和警報(Performance Logs and Alerts)兩個部分. 通過實時和日志的方式來記錄服務(wù)器性能. 使用系統(tǒng)監(jiān)視器可以取現(xiàn), 曲方圖或者報表的方式實時查看內(nèi)存, 硬盤, 處理器, 網(wǎng)絡(luò)等各種對象的性能數(shù)據(jù). 使用性能日志也警報可以對計數(shù)器日志進行配置, 記錄性能數(shù)據(jù), 設(shè)置性能警報, 通過設(shè)定性能警報, 可以使系統(tǒng)在某一特定的計數(shù)器值低于或高于指定的值時及時通知系統(tǒng)管理員.
下面簡單介紹Windows Server 2003下的Performance Monitor, 通過日志記錄性能數(shù)據(jù), 之后分析.
1. 打開:Administrative Tools->Performance,
或SQL Server Profiler->Tools->Performance Monitor,或在運行中輸入"perfmon"
2.重要的性能計數(shù)器
(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
下表對重要的性能計數(shù)器做一個簡要的說明:
性能計數(shù)器: | ||
Performance Object | Counter | Description |
Processor | %processor Time | 指處理器執(zhí)行非閑置線程時間的百分比,測量處理器繁忙的時間 這個計數(shù)器設(shè)計成用來作為處理器活動的主要指示器,可以選擇單個CPU實例,也可以選擇Total |
Interrupts/sec | 處理器正在處理的來自應(yīng)用程序或硬件的中斷的數(shù)量 | |
PhysicalDisk | % Disk Time |
計數(shù)器監(jiān)視磁盤忙于讀/寫活動所用時間的百分比.在系統(tǒng)監(jiān)視器中,PhysicalDisk: % Disk Time 計數(shù)器監(jiān)視磁盤忙于讀/寫活動所用時間的百分比。如果 PhysicalDisk: % Disk Time 計數(shù)器的值較高(大于 90%),請檢查 PhysicalDisk: Current Disk Queue Length 計數(shù)器了解等待進行磁盤訪問的系統(tǒng)請求數(shù)量。等待 I/O 請求的數(shù)量應(yīng)該保持在不超過組成物理磁盤的軸數(shù)的 1.5 到 2 倍。大多數(shù)磁盤只有一個軸,但獨立磁盤冗余陣列 (RAID) 設(shè) 備通常有多個軸。硬件 RAID 設(shè)備在系統(tǒng)監(jiān)視器中顯示為一個物理磁盤。通過軟件創(chuàng)建的多個 RAID 設(shè)備在系統(tǒng)監(jiān)視器中顯示為多個實例。
可以使用 Current Disk Queue Length 和 % Disk Time 計數(shù)器的值檢測磁盤子系統(tǒng)中的瓶頸。如果 Current Disk Queue Length 和 % Disk Time 計數(shù)器的值一直很高,則考慮下列事項:
1.使用速度更快的磁盤驅(qū)動器。
2.將某些文件移至其他磁盤或服務(wù)器。
3.如果正在使用一個 RAID 陣列,則在該陣列中添加磁盤。
計數(shù)器監(jiān)視磁盤忙于讀/寫活動所用時間的百分比.在系統(tǒng)監(jiān)視器中,PhysicalDisk: % Disk Time 計數(shù)器監(jiān)視磁盤忙于讀/寫活動所用時間的百分比。如果 PhysicalDisk: % Disk Time 計數(shù)器的值較高(大于 90%),請檢查 PhysicalDisk: Current Disk Queue Length 計數(shù)器了解等待進行磁 盤訪問的系統(tǒng)請求數(shù)量。等待 I/O 請求的數(shù)量應(yīng)該保持在不超過組成物理磁盤的軸數(shù)的 1.5 到 2 倍。大多數(shù)磁盤只有一個軸,但獨立磁盤冗余陣列 (RAID) 設(shè)備通常有多個軸。硬件 RAID 設(shè)備在系統(tǒng)監(jiān)視器中顯示為一個物理磁盤。通過軟件創(chuàng)建的多個 RAID 設(shè)備在系統(tǒng)監(jiān)視器中顯示為多個實例。 可以使用 Current Disk Queue Length 和 % Disk Time 計數(shù)器的值檢測磁盤子系統(tǒng)中的瓶頸。如果 Current Disk Queue Length 和 % Disk Time 計數(shù)器的值一直很高,則考慮下列事項: 1.使用速度更快的磁盤驅(qū)動器。 2.將某些文件移至其他磁盤或服務(wù)器。 3.如果正在使用一個 RAID 陣列,則在該陣列中添加磁盤。 |
Avg.Disk Queue Length | 指讀取和寫入請求(為所選磁盤在實例間隔中列隊的)的平均數(shù) | |
Current Disk Queue Length | 指示被掛起的磁盤 I/O 請求的數(shù)量。如果這個值始終高于 2, 就表示產(chǎn)生了擁塞 | |
Avg.Disk Bytes/Transfer | 寫入或讀取操作時向磁盤傳送或從磁盤傳出字節(jié)的平均數(shù) | |
Disk Bytes/sec | 在讀寫操作中,從磁盤傳出或傳送到磁盤的字節(jié)速率 | |
Memory | Pages/sec | 被請求頁面的數(shù)量. |
Available Bytes | 可用物理內(nèi)存的數(shù)量 | |
Committed Bytes | 已分配給物理 RAM 用于存儲或分配給頁面文件的虛擬內(nèi)存 | |
Pool Nonpaged Bytes | 未分頁池系統(tǒng)內(nèi)存區(qū)域中的 RAM 數(shù)量 | |
Page Faults/sec | 是每秒鐘出錯頁面的平均數(shù)量 | |
Network Interface | Bytes Received/sec | 使用本網(wǎng)絡(luò)適配器接收的字節(jié)數(shù) |
Bytes Sent/sec | 使用本網(wǎng)絡(luò)適配器發(fā)送的字節(jié)數(shù) | |
Bytes Total/sec | 使用本網(wǎng)絡(luò)適配器發(fā)送和接收的字節(jié)數(shù) | |
Server | Bytes Received/sec | 把此計數(shù)器與網(wǎng)絡(luò)適配器的總帶寬相比較,確定網(wǎng)絡(luò)連接是否產(chǎn)生瓶頸 |
SQL Server Access Methods | Page Splits/sec | 每秒由于索引頁溢出而發(fā)生的頁拆分數(shù).如果發(fā)現(xiàn)頁分裂的次數(shù)很多,考慮提高Index的填充因子.數(shù)據(jù)頁將會有更多的空間保留用于做數(shù)據(jù)的填充,從而減少頁拆分 |
Pages Allocated/sec | 在此 SQL Server 實例的所有數(shù)據(jù)庫中每秒分配的頁數(shù)。這些頁包括從混合區(qū)和統(tǒng)一區(qū)中分配的頁 | |
Full Scans/sec | 每秒不受限制的完全掃描數(shù). 這些掃描可以是基表掃描,也可以是全文索引掃描 | |
SQL Server: SQL Statistics | Batch Requests/Sec | 每秒收到的 Transact-SQL 命令批數(shù)。這一統(tǒng)計信息受所有約束(如 I/O、用戶數(shù)、高速緩存大小、請求的復(fù)雜程度等)影響。 批處理請求數(shù)值高意味著吞吐量 |
SQL Compilations/Sec | 每秒的編譯數(shù)。表示編譯代碼路徑被進入的次數(shù)。包括 SQL Server 中語句級重新編譯導(dǎo)致的編譯。當 SQL Server 用戶活動穩(wěn)定后, 該值將達到穩(wěn)定狀態(tài) |
|
Re-Compilations/Sec | 每秒語句重新編譯的次數(shù)。計算語句重新編譯被觸發(fā)的次數(shù)。一般來說,這個數(shù)最好較小,存儲過程在理想情況下應(yīng)該只編譯一次, 然后執(zhí)行計劃被重復(fù)使用. 如果該計數(shù)器的值較高,或許需要換個方式編寫存儲過程,從而減少重編譯的次數(shù) |
|
SQL Server: Databases | Log Flushes/sec | 每秒日志刷新數(shù)目 |
Active Transactions | 數(shù)據(jù)庫的活動事務(wù)數(shù) | |
Backup/Restore Throughput/sec | 每秒數(shù)據(jù)庫的備份和還原操作的讀取/寫入吞吐量。例如,并行使用多個備份設(shè)備或使用更快的設(shè)備時,可以測量數(shù)據(jù)庫備份操作性能的變化情況。 數(shù)據(jù)庫的備份或還原操作的吞吐量可以確定備份和還原操作的進程和性能 |
|
SQL Server General Statistics | User Connections | 系統(tǒng)中活動的SQL連接數(shù). 該計數(shù)器的信息可以用于找出系統(tǒng)的最大并發(fā)用戶數(shù) |
Temp Tables Creation Rate | 每秒創(chuàng)建的臨時表/表變量的數(shù)目 | |
Temp Tables For Destruction | 等待被清除系統(tǒng)線程破壞的臨時表/表變量數(shù) | |
SQL Server Locks |
Number of Deadlocks/sec | 指每秒導(dǎo)致死鎖的鎖請求數(shù). 死鎖對于應(yīng)用程序的可伸縮性非常有害, 并且會導(dǎo)致惡劣的用戶體驗. 該計數(shù)器必須為0 |
Average Wait Time (ms) | 每個導(dǎo)致等待的鎖請求的平均等待時間 | |
Lock requests/sec | 鎖管理器每秒請求的新鎖和鎖轉(zhuǎn)換數(shù). 通過優(yōu)化查詢來減少讀取次數(shù), 可以減少該計數(shù)器的值 | |
SQL Server:Memory Manager | Total Server Memory (KB) | 從緩沖池提交的內(nèi)存(這不是 SQL Server 使用的總內(nèi)存) |
Target Server Memory (KB) | 服務(wù)器能夠使用的動態(tài)內(nèi)存總量 | |
SQL Cache Memory(KB) | 服務(wù)器正在用于動態(tài) SQL 高速緩存的動態(tài)內(nèi)存總數(shù) | |
Memory Grants Pending | 指每秒等待工作空間內(nèi)存授權(quán)的進程數(shù). 該計數(shù)器應(yīng)該盡可能接近0,否則預(yù)示可能存在著內(nèi)存瓶頸 | |
SQL Server Buffer Manager | Buffer Cache Hit Ratio | 緩存命中率,在緩沖區(qū)高速緩存中找到而不需要從磁盤中讀取(物理I/O)的頁的百分比. 如果該值較低則可能存在內(nèi)存不足或不正確的索引 |
Page Reads/sec | 每秒發(fā)出的物理數(shù)據(jù)庫頁讀取數(shù)。此統(tǒng)計信息顯示的是所有數(shù)據(jù)庫間的物理頁讀取總數(shù)。由于物理 I/O 的開銷大,可以通過使用更大的數(shù)據(jù)緩存、智能索引、更有效的查詢或更改數(shù)據(jù)庫設(shè)計等方法,將開銷降到最低 | |
Page Writes/sec | 每秒執(zhí)行的物理數(shù)據(jù)庫頁寫入數(shù) | |
Page Life Expectancy | 頁若不被引用將在緩沖池中停留的秒數(shù) | |
Lazy Writes/Sec | 每秒被緩沖區(qū)管理器的惰性編寫器寫入的緩沖區(qū)數(shù) | |
Checkpoint Pages/Sec | 由要求刷新所有臟頁的檢查點或其他操作每秒刷新到磁盤的頁數(shù) | |
提示:
當監(jiān)視Windows Server或SQL Server以調(diào)查與性能有關(guān)的問題時,請首選關(guān)注一下硬件的三方面:
(1) CPU(處理器使用率)
(2) RAM(內(nèi)存使用率)
(3) HDD(磁盤活動即IO)
3.建立監(jiān)視
下面要建立監(jiān)視(我監(jiān)視的HP Server配置為:Intel 4x4 x 3.0 GHz/RAM 16.0G,業(yè)務(wù)系統(tǒng)為OLTP).
(1) 在performance->Performance Logs and Alerts->New Log Setting...
(2) General Tab->Add Counters,添加需要監(jiān)測的計數(shù)器(可參考如上的計數(shù)器列表)
(3) General Tab->Interval,設(shè)置監(jiān)測的時間間隔(默認是15s)
(4) Log Files Tab->Log file type,選擇Log File保存的方式(text File,Binary File,SQL Database),這里我選擇text File(Tab delimited).
(5) Schedule Tab,設(shè)置監(jiān)測的開始時間及結(jié)束時間.
4.分析(我做測試監(jiān)測的時間段(2010/7/7 10:30-23:59))
在監(jiān)測一段時間之后,你就會得到Server重要的性能計數(shù)器信息,接下來就可以分析Server的性能. 我是借助數(shù)據(jù)透視圖來做的,看起來會比較直觀.
4.1 CPU使用率.分析%Processor Time(_Total)(所用時間的百分比,橫軸取時間,豎軸取%Processor Time)
如下圖在2010/7/7 10:30-12:40和2010/7/7 16:44-18:48這兩段時間內(nèi)CPU的使用率很高基本上都在50%以上.尤其在17:00-17:12,17:53-18:00CPU很繁忙,在這段時間會有大量的事務(wù)需要處理(T-SQL查詢,SP,后臺job, User操作等等).
如果CUP使用率一直居高不下(持續(xù)80%到90%的狀態(tài)),就要考慮升級CPU, 增加更多的處理器或者系統(tǒng)調(diào)優(yōu)(建議先做系統(tǒng)調(diào)優(yōu),升級硬件需要增加額外的成本).
4.2 磁盤I/O(%Disk Time,磁盤忙于讀/寫活動所用時間的百分比)
監(jiān)視磁盤活動涉及到兩個主要方面:
(1)監(jiān)視磁盤I/O及檢測是否有過度換頁
(2)隔離SQL Server產(chǎn)生的磁盤活動
從做的數(shù)據(jù)透視圖來看,磁盤I/O的讀寫很清閑,只在11:58,15:00,18:00,23:45左右(圖上沒有截出來)會有較大的IO.
如果磁盤I/O很高(>90%),則考慮更換快速磁盤(如固態(tài)硬盤等).
請參考微軟給出的解決方案:
可以對下面兩個計數(shù)器進行監(jiān)視以確定磁盤活動:
- PhysicalDisk: % Disk Time
- PhysicalDisk: Avg. Disk Queue Length
在系統(tǒng)監(jiān)視器中,PhysicalDisk: % Disk Time 計數(shù)器監(jiān)視磁盤忙于讀/寫活動所用時間的百分比。如果 PhysicalDisk: % Disk Time 計數(shù)器的值較高(大于 90%),請檢查PhysicalDisk: Current Disk Queue Length 計數(shù)器了解等待進行磁盤訪問的系統(tǒng)請求數(shù)量。等待 I/O 請求的數(shù)量應(yīng)該保持在不超過組成物理磁盤的軸數(shù)的 1.5 到 2 倍。大多數(shù)磁盤只有一個軸,但獨立磁盤冗余陣列 (RAID) 設(shè)備通常有多個軸。硬件 RAID 設(shè)備在系統(tǒng)監(jiān)視器中顯示為一個物理磁盤。通過軟件創(chuàng)建的多個 RAID 設(shè)備在系統(tǒng)監(jiān)視器中顯示為多個實例。
可以使用 Current Disk Queue Length 和 % Disk Time 計數(shù)器的值檢測磁盤子系統(tǒng)中的瓶頸。如果 Current Disk Queue Length 和 % Disk Time 計數(shù)器的值一直很高,則考慮下列事項:
- 使用速度更快的磁盤驅(qū)動器。
- 將某些文件移至其他磁盤或服務(wù)器。
- 如果正在使用一個 RAID 陣列,則在該陣列中添加磁盤。
如果使用 RAID 設(shè)備,% Disk Time 計數(shù)器會指示大于 100% 的值。如果出現(xiàn)這種情況,則使用 PhysicalDisk: Avg.Disk Queue Length 計數(shù)器來確定等待進行磁盤訪問的平均系統(tǒng)請求數(shù)量。
I/O 依賴的應(yīng)用程序或系統(tǒng)可能會使磁盤持續(xù)處于活動狀態(tài)。
監(jiān)視 Memory: Page Faults/sec 計數(shù)器可以確保磁盤活動不是由分頁導(dǎo)致的。在 Windows 中,換頁的原因包括:
- 配置進程占用了過多內(nèi)存。
- 文件系統(tǒng)活動。
如果在同一硬盤上有多個邏輯分區(qū),請使用 Logical Disk 計數(shù)器而非 Physical Disk 計數(shù)器。查看邏輯磁盤計數(shù)器有助于確定哪些文件被頻繁訪問。當發(fā)現(xiàn)磁盤有大量讀/寫活動時,請查看讀寫專用計數(shù)器以確定導(dǎo)致每個邏輯卷負荷增加的磁盤活動類型,例如,Logical Disk: Disk Write Bytes/sec。
隔離 SQL Server 產(chǎn)生的磁盤活動
可以進行監(jiān)視以確定由 SQL Server 組件生成的 I/O 活動量的兩個計數(shù)器為:
- SQL Server:Buffer Manager:Page reads/sec
- SQL Server:Buffer Manager:Page writes/sec
在系統(tǒng)監(jiān)視器中,這些計數(shù)器通過檢查以下操作的性能監(jiān)視由 SQL Server 組件生成的 I/O 活動量。
- 向磁盤寫入頁
- 從磁盤讀取頁
如果這些計數(shù)器的值達到硬件 I/O 子系統(tǒng)的容量限制,則需要減小這些值,方法是調(diào)整應(yīng)用程序或數(shù)據(jù)庫以減少 I/O 操作(如索引覆蓋、索引優(yōu)化或規(guī)范化),增加硬件的 I/O 容量或添加內(nèi)存
4.3 緩存命中率(Buffer Cache Hit Ratio)
根據(jù)檢測的數(shù)據(jù)來看,緩存命中率基本上在99.99%-100%之間,表示數(shù)據(jù)緩存幾乎滿足所有的數(shù)據(jù)請求.
4.4 頁拆分(Page Splits/sec,每秒由于索引頁益處而發(fā)生的頁拆分數(shù))
如果頁拆分很頻繁,可以考慮增加填充因子(我設(shè)置的Index fill factor為85,也就是每個頁會留有15%的空間做數(shù)據(jù)填充).
從我做的檢測來看,只有在很少的時間段內(nèi)會有較大的頁拆分,此時可能會有大量的數(shù)據(jù)事務(wù)操作.總體來看性能還好.
4.5 每秒日志刷新數(shù)目(Log Flushes/sec)
日志刷新發(fā)生在當transaction提交, 數(shù)據(jù)從日志緩存寫入磁盤日志文件時. 應(yīng)該盡可能的減少日志刷新.
如果檢測到數(shù)值一直很高的話,說明transaction非?;钴S,就要減少transaction數(shù).
這里有一個簡單的示例來說明:
比如說要向Table中Insert 1w條數(shù)據(jù)
做法1: 一條一條的Insert,一個transaction一條. 會產(chǎn)生1w個log flushes
做法2: 1w條數(shù)據(jù)在一個transaction Insert.只產(chǎn)生1個log flushes
明顯的第二種產(chǎn)生的日志刷新會大大減少,相應(yīng)的磁盤I/O也大大減少.從而有助于提高性能.
總結(jié):
(1). 還有很多的日志記錄沒有做一一的簡單分析.
(2). Performance Monitor只是提供一個方法來幫助發(fā)現(xiàn)問題,提供一個性能優(yōu)化的方向. 一旦影響性能的問題找到了,就可以從這個方向來著手處理.
(3). 網(wǎng)上有很多性能檢測的工具,大抵應(yīng)該是把如上所做的工作封裝起來,并且UI上面已經(jīng)分析好,更加的直觀.
(4). 如果寫的有不當之處,歡迎指出指正,謝謝!
另:
參考文章:http://www.sql-server-performance.com/tips/sql_server_performance_monitor_coutners_p1.aspx
微軟對計數(shù)器更詳細的描述:http://technet.microsoft.com/en-us/library/ms190382.aspx
本文標題:SQL Server性能調(diào)教系列(2)--Server Performance Monitor(Perfmon)
鏈接:http://www.cnblogs.com/changbluesky/archive/2010/07/12/1771210.html
【編輯推薦】
- 對SQL Server SQL語句進行優(yōu)化的10個原則
- SQL Server分析服務(wù)性能優(yōu)化淺析
- SQL Server MS SQL語句的分類
- 教你如何優(yōu)化SQL語句中的物理查詢
- 轉(zhuǎn)移SQL Server數(shù)據(jù)的實現(xiàn)