SQL Server監控常規計數器收集參考(mssql阻塞的跟蹤查詢,死鎖的跟蹤查詢,改善)

常規計數器收集操作系統服務器的服務器性能信息,包括Processor、磁盤、網絡、內存

Processor 處理器

1.1 % Processor Time指處理器用來執行非閒置線程時間的百分比。通過此計數器可以確定服務器當前CPU使用百分比。

1.2 % Privileged Time是在特權模式下進程線程執行代碼所花時間的百分比。當調用 Windows 系統服務時,此服務經常在特權模式運行,以便獲取對系統專有數據的訪問。

PhysicalDisk物理磁盤(某個RAID)

2.1 Avg. Disk Queue Length等待請求的隊列長度,若此值過大,說明磁盤存在瓶頸,自然磁盤延遲的值也會過大。

2.2 Avg. Disk sec/Read;Avg. Disk sec/Transfer;Avg. Disk sec/Write這三個計數器表示磁盤每次讀寫需要多少時間,表示磁盤的延遲情況,以秒爲單位,若延遲超過25mm表示磁盤性能較差。

LogicalDisk邏輯磁盤(某個卷)

3.1 % Free Space某個磁盤的空閒百分比;Free Megabytes 磁盤剩餘大小MB

3.2 Disk Read Bytes/sec;Disk Transfers/sec;Disk Write Bytes/sec這三個計數器表示每秒磁盤的讀寫情況,表示磁盤的IO性能(iops)

Memory 內存

4.1 Available Mbytes可以內存大小MB,此內存能立刻分配給一個進程或系統使用。它等於分配給待機(緩存的)、空閒和零分頁列表內存的總和。

4.2 Cache Bytes 系統使用的內存

4.3 Commit Limit可以申請的內存總大小(虛擬內存和物理內存);Committed Bytes已經使用的內存大小(虛擬內存和物理內存);均是以Byte(字節)爲單位。

4.4 Free System Page Table Entries指系統當前未使用的頁表項數目。表示內存是否空閒。

4.5 Page Faults/sec 每秒出錯頁面的數量,也就是未在內存中命中的頁面數。因此伴隨着Pages/sec計數器是由於出錯頁面從磁盤讀取數據頁的速度。此值越大說明內存可能存在一定瓶頸,或者存在大量數據存取。

Network Interface 網絡接口

5.1 Current Bandwidth指以位/每秒估計的網絡接口的當前帶寬。對於那些帶寬不變的或無法估計出準確數據的界面,這個值爲名義帶寬。

5.2 Bytes Received/sec;Bytes Sent/sec;Bytes Total/sec每秒種發送和接收的字節數,表示當前網絡的使用情況。

5.3 Output Queue Length輸出數據包隊列,此值大於2說明傳輸存在延遲。

5.4 Packets Outbound Discarded 被選爲丟棄的數據包數目,丟棄的原因可能是釋放緩衝空間。Packets Outbound Errors 由於錯誤不能傳輸的數據包數目

5.5 Packets Received Discarded 被選爲丟棄的數據包數目,丟棄的原因可能是釋放緩衝空間。Packets Received Errors 由於錯誤不能傳輸的數據包數目

SQL Server計數器

SQL Server中的Access Methods對象提供監視訪問數據庫中的邏輯數據的計數器;Buffer Manager計數器監視對磁盤上的數據庫也的物理訪問。

Access Methods 存取方式

Access Methods監視用於訪問數據庫中存儲的數據的方法有助於確定是否可以通過添加或修改索引、添加或移動分區、添加文件或文件組、對索引進行碎片整理或者重寫查詢來提高查詢性能。 Access Methods 計數器也可用於監視數據庫中數據、索引和可用空間的數量,從而指示每個服務器實例的數據卷和碎片。索引的碎片過多會降低性能。

1.1 Page Splits/sec每秒由於索引頁溢出而發生的頁拆分數。此數據越大表示某表的修改頻率較高,且要確認該索引是否適合建立該字段上。

1.2 Workfiles Created/sec每秒創建的工作文件數

1.3 Worktables Created/sec每秒創建的工作表數

Buffer Manager 緩存管理

監視用於存儲數據頁的內存;讀取和寫入數據庫頁時的物理io等,通過此對象可以判斷是否存在物理內存瓶頸可以瞭解服務器的查詢性能等等。

2.1 Buffer cache hit ratio命中高速緩衝區頁的百分比。若此值過低說明可能內存存在一定瓶頸

2.2 Database pages緩衝池中數據庫內容的頁數

2.3 Page life expectancy頁指示頁面在沒有引用的情況下,在此節點的緩衝池中停留的時間(以秒計)。此值若降低說明,服務器頻繁查詢數據庫中數據。

2.4 Checkpoint pages/sec Checkpoint的執行頻率,若執行的頻率過高。則說明服務器過於頻繁的修改數據。

2.5 Lazy writes/sec 若懶寫入過於頻繁,說明沒有空閒的緩衝區供使用,內存可能存在一定瓶頸。“惰性編寫器”是一個系統進程,用於成批刷新髒的過期的緩衝區(包含更改的緩衝 區,必須將這些更改寫回磁盤,才能將緩衝區重用於其他頁),並使它們可用於用戶進程。

Memory Manager 內存管理

監視總體的服務器內存使用情況,以估計用戶活動和資源使用,有助於查明性能瓶頸。

3.1 Memory Grants Pending指定等待工作空間內存授權的進程總數。指等待分配內存的進程數量,若此值過高或內存或磁盤存在一定瓶頸。

3.2 Target Server Memory (KB);Total Server Memory (KB)理想上能使用內存量與內存管理器提交的內存量。若此兩值存在差異則說明內存異常。

General Statistics 常規統計

4.1 User Connections;Logins/sec;Logouts/sec 用戶併發情況

4.2 Processes blocked當前阻塞數量

4.3 Temp Tables For Destruction等待被清除系統線程破壞的臨時表/表變量數。無用的臨時表和表變量。

SQL Statistics; Wait Statistics請求與等待統計

5.1 Batch Requests/sec;SQL Compilations/sec;SQL Re-Compilations/sec每秒的請求、編譯和重編譯的次數,這些對於優化供參考。

5.2 Lock waits等待鎖的進程數。

5.3 Log write waits等待寫入日誌緩存的進程數

5.4 Page IO latch waits與頁 I/O 閂鎖相關的統計信息。用於判斷內存或磁盤的瓶頸情況

5.5 Page latch waits與頁閂鎖(不包括 I/O 閂鎖)相關的統計信息。用於判斷內存或磁盤的瓶頸情況

Databases針對數據庫級別

6.1 Log Flush Wait Time;Log Flushes/sec日誌刷新等待和頻率,若數據異常則可能存在磁盤瓶頸

6.2 Transactions/sec 事務數

Locks

7.1 Lock Requests/sec;Lock Timeouts/sec鎖請求頻率;鎖超時頻率

7.2 Number of Deadlocks/sec 死鎖情況。

------------------------------------------------------------------------------------

磁盤相關

           ins_dir = MSSQL_DIR + "/ms" + str(port)data_dir = ins_dir + '/data'log_dir = ins_dir + '/log' backup_dir = ins_dir + '/backup' ins_size = func_os.get_dir_size( ins_dir)          data_size = func_os.get_dir_size(data_dir)log_size = func_os.get_dir_size(log_dir) backup_size = func_os.get_dir_size( backup_dir)real_ins_size = ins_size - backup_size          other_size = real_ins_size - data_size - log_size
總空間:real_ins_size = 實例目錄空間 - 備份空間(落地備)數據空間:data_size其他文件空間:other_size = 總空間 - 數據空間 - 日誌空間 = tepmdb空間大小(日誌+數據)+ 其它(errorlog+agentlog+fulltextlog+系統庫+JOBS)BinLog空間:log_size

SQL Server性能相關

動態管理視圖和函數

   與session執行有關sys.dm_exec_connectionssys.dm_exec_sessions與系統有關sys.dm_os_performance_counters與IO相關sys.dm_io_virtual_file_stats

目錄視圖

   數據庫和文件目錄視圖sys.master_filessys.databases

sessions

   命令 select count(*) from sys.dm_exec_sessions where login_name not in ( 'root', 'aurora', 'sa', 'eagleye') and login_name not like 's\_%' escape '\' and login_name not like %mssqld' and login_name not like '%Administrator' and status not in ( 'Preconnect', 'Dormant‘)解釋sys.dm_exec_sessions:是服務器範圍的視圖,顯 示了有關所有活動用戶連接和內部任務的信息。login_name 當前執行的會話所使用的 SQL Server 登錄名。status    會話的狀態。 可能的值:Running - 當前正在運行一個或多個請求Sleeping - 當前沒有運行任何請求Dormant – 會話因連接池而被重置,並且現在處於登錄前狀態。Preconnect - 會話在資源調控器分類器中。分類資源調控器支持對傳入會話的分類。分類基於函數中包含的一組用戶編寫的條件。函數邏輯的結果使資源調控器可以將會話歸入現 有工作負荷組類。會話傳入鏈接——分類(分類器函數)——路由到工作負荷組——工作負荷組使用相關聯的資源池——資源池提供同時限制應用程序資源

bufferhit

命令 SELECT a.cntr_value * 1.0 / b.cntr_value * 100.0 AS BufferCacheHitRatio FROM sys.dm_os_performance_counters a JOIN ( SELECT cntr_value, OBJECT_NAME FROM sys.dm_os_performance_counters WHERE counter_name = 'Buffer cache hit ratio base' AND OBJECT_NAME = 'MSSQL$MS%d:Buffer Manager') b ON a.OBJECT_NAME = b.OBJECT_NAME WHERE a.counter_name = 'Buffer cache hit ratio' AND a.OBJECT_NAME = 'MSSQL$MS%d:Buffer Manager'解釋 sys.dm_os_performance_counters       爲服務器維護的每個性能計數器返回一行。counter_name    計數器的名稱OBJECT_NAME          計數器的所屬類別 Buffer Manager 對象提供了計數器,用於監視 SQL Server 如何使用:內存存儲數據頁、內部數據結構和過程緩存。計數器監視 SQL Server 讀取和寫入數據庫頁時的物理 I/O。Buffer Manager中的Buffer cache hit ratio base和Buffer cache hit ratioBuffer cache hit ratio 官方解釋在緩衝區高速緩存中找到而不需要從磁盤中讀取的頁的百分比。經驗正常情況應該在 99%以上

checkpoint

命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name = 'MSSQL$MS%d:Buffer Manager' AND counter_name = 'Checkpoint pages/sec'解釋由要求刷新所有髒頁的檢查點或其他操作每秒刷新到磁盤的頁數。經驗 1. 顯示執行 checkpoint;會發生checkpoint 2. alter database 添加或刪除數據庫文件;會發生checkpoint 3. 停止服務;會發生checkpoint 4. engine定期生成checkpoint,跟 recovery interval、恢復模式相關 5. 備份;會發生checkpoint 6. 在數據庫中執行了最小日誌記錄操作,例如,在使用大容量日誌恢復模式的數據庫中執行大容量複製操作;會發生checkpoint 7 執行了需要關閉數據庫的活動。例如,AUTO_CLOSE 設置爲 ON 並且關閉了數據庫的最後一個用戶連接,或者執行了需要重新啓動數據庫的數據庫選項更改;會發生checkpoint 8. 08R2 checkpoint是實例級別的配置,但進行的過程(實現方式)是數據庫級別的,這個msdn沒有詳細說明但可以做實驗證明,大概方法可以構造兩個數據庫和相應數據,不同的DB session手動執行checkpoint觀察sys.dm_os_buffer_descriptors 9. 髒頁的多少影響checkpoint開銷大小 10. 08R2鏡像端不支持checkpoint

pagelife

命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name = 'MSSQL$MS%d:Buffer Manager    ' AND counter_name = 'Page life expectancy'解釋表示頁面在緩存中的預期 "壽命",單位爲秒。微軟建議最少 300秒。如果在一個實例中經常低於 300秒,意味着數據保留的時間少於 5分鐘就被移出內存。經驗 1. 正常PLE應該是大於 300且爲一條持續平穩上升的直線 2. PLE經常性的波動可能是內存壓力的信號,具體再結合lazy_write,page_writes/page_reads等一起觀察判定

sqlcompilations

命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name = 'MSSQL$MS%d:SQL Statistics' AND counter_name = 'SQL Compilations/sec'解釋每秒的 SQL 編譯數。 表示編譯代碼路徑被進入的次數。 包括 SQL Server 中語句級重新編譯導致的編譯。 當 SQL Server 用戶活動穩定後,該值將達到穩定狀態。經驗編譯截斷主要是CPU開銷,一般可以和Batch Requests/sec對照來看

logins

命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name = 'MSSQL$MS%d:General Statistics' AND counter_name = 'Logins/sec'解釋 General Statistics 對象提供計數器,用於監視服務器範圍內的常規活動Logins/sec   每秒啓動的登錄數。 這不包括已入池連接。

transactions

命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name LIKE 'MSSQL$MS%d:database%%' AND instance_name = '_Total' AND counter_name LIKE 'Transactions/sec%%'解釋 Database 對象提供了計數器,來監視大容量複製操作、備份和還原吞吐量以及事務日誌活動。_Total     有的計數器的instance_name中有值爲_Total的實例,它是對該計數器所有實例的聚合值( SUM)。Transactions/sec       每秒爲數據庫啓動的事務數經驗理解SQLServer的Transactions和Batch Requests,一個Batch Requests可能有多個Transactions,Batch Requests更能說明系統負載

locktimeout

命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name = 'MSSQL$MS%d:Locks' AND counter_name = 'Lock Timeouts/sec' AND instance_name = '_Total'解釋Locks 對象提供了有關各種資源類型的 SQL Server 鎖的信息 Lock Timeouts/sec    每秒超時的鎖請求數,包括對 NOWAIT 鎖的請求。

deadlock

命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name = 'MSSQL$MS%d:Locks' AND counter_name = 'Number of Deadlocks/sec' AND instance_name = '_Total'解釋 Number of Deadlocks/sec     每秒導致死鎖的鎖請求數。經驗經常死鎖可能會導致嚴重的問題,藉助Profiler可以解,但在RDS場景下最好的處理方式是打開Flag 1222 通過日誌分析

lockwaits

命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name = 'MSSQL$MS%d:Locks' AND counter_name = 'Lock Waits/sec' AND instance_name = '_Total'解釋 Lock Waits/sec   每秒要求調用者等待的鎖請求數。

fullscans

命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name = 'MSSQL$MS%d:Access Methods' AND counter_name = 'Full Scans/sec'解釋 Access Methods       對象提供用於監視如何訪問數據庫中的邏輯數據的計數器。 Full Scans/sec    每秒不受限制的完全掃描數。這些掃描可以是基表掃描,也可以是全文索引掃描。

pagesplits

命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name = 'MSSQL$MS%d:Access Methods ' AND counter_name = 'Page Splits/sec'解釋Page Splits/sec   每秒由於索引頁溢出而發生的頁拆分數。經驗頁拆分會搬移數據,性能開銷,和fillfactor參數有聯繫; 12相對於 08有優化,碰到大條記錄拆分一次放不下可能會嘗試生成一個新頁存放,優化出現連續拆分的情況

lazy_writes

命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name = 'MSSQL$MS%d:Buffer Manager' AND counter_name = 'Lazy writes/sec'解釋Lazy writes/sec   每秒被緩衝區管理器的惰性編寫器寫入的緩衝區數。惰性編寫器    一個系統進程,用於成批刷新髒的老化的緩衝區(包含更改的緩衝區,必須將這些更改寫回磁盤,才能將緩衝區重用於其他頁),並使它們可用於用戶進程。當 SQL Server感覺到內存壓力的時候,會將最久沒有使用的數據頁面和執行計劃從緩 衝池中清理掉,做這個動作的就是Lazy Writer。經驗Lazy writes有單獨一個系統進程,刷髒頁的過程和checkpoint類似同樣會有性能影響,對比checkpoint可以理解爲兩者的行爲類似但目的不 同,Lazy writes是保證內存有可用頁,一般有內存壓力的時候會頻繁出現,Checkpoint聚合寫、優化IO、維護數據一致性,可以結合PLE一起觀察內存 問題

pagereads

命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name = 'MSSQL$MS%d:Buffer Manager ' AND counter_name = 'Page reads/sec'理解Page reads/sec  每秒發出的物理數據庫頁讀取數。經驗大量物理讀寫和IOPS升高是一致的;頻繁持續的物理讀寫過高先找找是否有需要優化改寫的 SQL或者考慮增加內存,當然內存是有成本的最好的方式還是通過rewrite queries/ add intelligent indexes處理;

pagewrite

命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name = 'MSSQL$MS%d:Buffer Manager' AND counter_name = 'Page writes/sec'理解Page writes/sec  每秒執行的物理數據庫頁寫入數。經驗大量物理讀寫和IOPS升高是一致的;頻繁持續的物理讀寫過高先找找是否有需要優化改寫的 SQL或者考慮增加內存,當然內存是有成本的最好的方式還是通過rewrite queries/ add intelligent indexes處理;

qps

命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name = 'MSSQL$MS%d:SQL Statistics' AND counter_name = 'Batch Requests/sec'理解 SQL Statistics      對象提供計數器來監視編譯和發送到 SQL Server 實例的請求類型。通過監視查詢編譯和重新編譯的次數以及 SQL Server 實例收到的批數,可瞭解 SQL Server 處理用戶查詢的速度,以及查詢優化器處理查詢的效率。Batch Requests/sec  每秒收到的 Transact- SQL 命令批數。經驗這個Batch Requests跟MySQL的QPS不同,SQLServer一個Batch Requests可能包含多個Transactions

traffic_kb

命令 SELECT round( SUM(net_packet_size * 1.0 * num_reads / 1024), 0) AS read_kb, round( SUM(net_packet_size * 1.0 * num_writes / 1024), 0) AS write_kb FROM sys.dm_exec_connections WHERE session_id > 50理解dm_exec_connections     返回與 SQL Server 實例建立的連接有關的信息以及每個連接的詳細信息。net_packet_size  用於信息和數據的網絡包的大小。可爲 Null 值。num_reads   此連接中已發生的讀包次數。可爲 Null 值。num_writes  此連接中已發生的寫數據包次數。可爲 Null 值。session_id    標識與此連接關聯的會話。可爲 Null 值。

db_io

命令 SELECT SUM(fs.num_of_reads + fs.num_of_writes) AS [mssql_db_log_io] FROM sys.dm_io_virtual_file_stats( NULL, NULL) AS fs INNER JOIN sys.master_files AS f ON fs.database_id = f.database_id AND fs.file_id = f.file_id INNER JOIN sys.databases AS d ON d.database_id = f.database_id AND d.name IN (%s) GROUP BY d.name ORDER BY d.name解釋sys.dm_io_virtual_file_stats     返回數據和日誌文件的 I/O 統計信息。num_of_reads     對文件發出的讀取次數。num_of_writes    在該文件中寫入的次數。sys.master_files  存儲在 master 數據庫中的每個數據庫文件都在表中佔用一行。database_id 應用此文件的數據庫的 IDmaster database_id 始終爲 1。file_id    數據庫內文件的 ID。主 file_id 始終爲 1sys.databases     實例中的每個數據庫都對應一行 name     數據庫名稱

activesession

命令 select COUNT(*) from sys.dm_exec_sessionswhere login_name not in ( 'root', 'aurora', 'sa', 'eagleye') and login_name not like 's\_%' escape '\' and login_name not like '%mssqld' and login_name not like '%Administrator' and status not in ( 'Preconnect', 'Dormant', 'Sleeping') and session_id > 50解釋比之前的session監控多了Sleeping和session_id> 50的過濾條件Sleeping      當前沒有運行任何請求經驗activesession過高一般業務都會出現卡慢,但這個值只是一個結果表現,具體導致原因還需要其它進一步排查

connectionreset

   命令 SELECT cntr_value FROM sys.dm_os_performance_counters WHERE object_name = 'MSSQL$MS%s:General Statistics' AND counter_name = 'Connection Resets/sec'解釋 Connection Resets/sec    從連接池啓動的登錄總次數。                

------------------------------------------------------------------------------------

死鎖的四個必要條件:

  • 互斥條件(Mutual exclusion):資源不能被共享,只能由一個進程使用。
  • 請求與保持條件(Hold and wait):已經得到資源的進程可以再次申請新的資源。
  • 非剝奪條件(No pre-emption):已經分配的資源不能從相應的進程中被強制地剝奪。
  • 循環等待條件(Circular wait):系統中若干進程組成環路,該環路中每個進程都在等待相鄰進程正佔用的資源

1. 圖形化查詢:

sqlserver -->工具--> sql server profiler

2. 使用日誌跟蹤

以全局方式打開指定的跟蹤標記

        DBCC TRACEON(1222,-1)

       DBCC TRACEON(1204,-1)

使用  EXEC master..xp_readerrorlog 查看日誌。

3.使用sql分析查詢死鎖與阻塞腳本:

/*
功能說明: 數據庫死鎖與阻塞語句查詢
*/
DECLARE @spid INT
DECLARE @blk INT
DECLARE @count INT
DECLARE @index INT
DECLARE @LOCK TINYINT

SET @LOCK=0

CREATE TABLE #temp_who_lock
(
 id   INT IDENTITY(1, 1),
 spid INT,
 blk  INT
)

--if @@error<>0 return @@error    
INSERT INTO #temp_who_lock
        (spid,
         blk)
SELECT 0,
   blocked
FROM   (SELECT *
    FROM   master..sysprocesses
    WHERE  blocked > 0)a
WHERE  NOT EXISTS(SELECT *
              FROM   master..sysprocesses
              WHERE  a.blocked = spid
                     AND blocked > 0)
UNION
SELECT spid,
   blocked
FROM   master..sysprocesses
WHERE  blocked > 0

--if @@error<>0 return @@error    
SELECT @count = Count(*),
   @index = 1
FROM   #temp_who_lock

--select @count,@index

--if @@error<>0 return @@error    
IF @count = 0
BEGIN
  SELECT '沒有阻塞和死鎖信息' 
--return 0    
END

WHILE @index <= @count
BEGIN
  IF EXISTS(SELECT 1
            FROM   #temp_who_lock a
            WHERE  id > @index
                   AND EXISTS(SELECT 1
                              FROM   #temp_who_lock
                              WHERE  id <= @index
                                     AND a.blk = spid))
    BEGIN
        SET @LOCK=1

        SELECT @spid = spid,
               @blk = blk
        FROM   #temp_who_lock
        WHERE  id = @index

        SELECT  '引起數據庫死鎖的是: ' + Cast(@spid AS VARCHAR(10)) + '進程號,其執行的SQL語法如下' ;

        SELECT @spid,
               @blk



        DBCC inputbuffer(@spid)


        DBCC inputbuffer(@blk)
    END

  SET @index=@index + 1
END

IF @LOCK = 0
BEGIN
  SET @index=1

  WHILE @index <= @count
    BEGIN
        SELECT @spid = spid,
               @blk = blk
        FROM   #temp_who_lock
        WHERE  id = @index

        IF @spid = 0
          SELECT '引起阻塞的是:' + Cast(@blk AS VARCHAR(10)) + '進程號,其執行的SQL語法如下' 
        ELSE
          SELECT '進程號SPID:' + Cast(@spid AS VARCHAR(10)) + '被' + '進程號SPID:' + Cast(@blk AS VARCHAR(10)) + '阻塞,其當前進程執行的SQL語法如下'

        PRINT ( LTRIM(@spid) + ''+ LTRIM(@blk));
        if(@spid <> 0)
        BEGIN
           DBCC inputbuffer(@spid)   --
         END

        DBCC inputbuffer(@blk)   --引起阻塞語句

        SET @index=@index + 1
    END
END

DROP TABLE #temp_who_lock

--return 0    
--KILL 54

4. SQLServer 死鎖的診斷和定位

---------------------------------------------------------------------------------------------------------

SqlServer內存瓶頸分析--SQLServer:Buffer Manager

SELECT TOP 312 * FROM  sys.dm_os_performance_counters
where object_name ='SQLServer:Buffer Manager' order by counter_name

1.Buffer cache hit ratio  平均值>=90%                                                                                                         

緩衝區是創建數據頁面的緩衝頁面池,這一般是SQL server內存池中最大的部分。這個計數器應該儘可能高。

低值表示只有少數的請求是在緩衝區,其他請求是在磁盤獲取服務

這種情況發生可能是SQL server還在準備狀態下,或緩衝區的增長需求超過最大可用內存,因此如果此值比較低,應該考慮爲系統增加內存。

2.Checkpoint pages/sec    平均值<30     

美好一個檢查點操作移到磁盤的頁面數量,這些值應該相當低,高值意味着緩衝中更多的頁面被標記爲髒頁面。

髒頁面是在緩衝區中被修改的頁面。一旦被修改,就標記爲髒並在下一個檢查點被寫回磁盤。

如果這個計數器較高說明系統發生大量的寫入操作,可能是I/O問題的徵兆。                                                                                                

3.Lazy writes/sec     平均值<20            

 記錄了緩衝區管理器的Lazy write進程每秒寫入的緩衝區數量。這個進程會把時間較長的髒頁面從緩衝區中刪除,將內存釋放

 數值過高說明I/O有問題或是內存問題。                                                                                                

4.Page life expectancy     平均值>300        

頁面平均壽命,表示一個不被引用的頁面在緩衝池中停留的時間。數值低意味着頁面從緩衝區中被移走

降低了緩衝的效率並指出內存壓力的可能。                                                                                                    

SELECT TOP 312 * FROM  sys.dm_os_performance_counters
where object_name ='SQLServer:Memory Manager' order by counter_name

1.Memory Grants Pending      平均值=0

值高說明內存短缺,需要將進度掛起等待內存空閒

2. Target Server Memory(KB)     接近物理內存大小

表示SQLServer希望消耗的動態內存總數。

3.Total Server Memory (KB  )    接近於Target Server Memory
當前分配給SQLerver的總內存。 如果低於Target Server Memory

那麼可能是SQLserver內存需求很低,服務器最大內存設置的太低
 

解決方案:

優化應用程序工作負載

爲SQLServer分配更多內存

增加系統內存

更新32位處理器爲64位

啓用3G進程空間

在32位SQLserver中使用4G以上內存

 

啓用3G進程空間:

在Boot.ini文件中增加3GB開關

[boot loader]

timeout=30

default=multi(0)disk(0)rdisk(0)partition(1)\WINNT

[operating systems]

multi(0)disk(0)rdisk(0)partition(1)\WINNT=

"Microsoft Windows Server 2008 Advanced Server"

/fastdetect /3GB

 

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