Sql-Server

如何調試緩衝區問題?

  • September 29, 2015

我有一個產品“Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64)”,它顯示出奇怪的緩衝區和頁面預期壽命 (PLE) 症狀。

我每分鐘都在我的伺服器上執行這個(跟踪這個問題):

SELECT @ple = CAST([cntr_value] AS VARCHAR(20))
FROM sys.dm_os_performance_counters
WHERE [object_name] LIKE '%Manager%'
AND [counter_name] = 'Page life expectancy'

SELECT @usedBufferPages = CAST(COUNT(*) /128 AS VARCHAR(20)) 
FROM sys.dm_os_buffer_descriptors

DECLARE @StartDate VARCHAR(8) = Convert(VARCHAR(8), GETDATE(), 14)
RAISERROR ('%s. PLE at %s and Used Buffers at %s at %s ', 0, 
           1,@runCountString ,@ple, @usedBufferPages, @StartDate) WITH NOWAIT  

這是一些範例輸出:

16. PLE 在 858 和 Used Buffers 在 7290 在 09:51:42
17. 918 的 PLE 和 09:52:42 的 7342 使用的緩衝區
18. 978 的 PLE 和 09:53:43 的 7408 使用的緩衝區
19. 1039 的 PLE 和 09:54:43 的 7547 使用的緩衝區
20. 1100 的 PLE 和 09:55:44 的 7697 使用的緩衝區
21. 1160 的 PLE 和 09:56:45 的 7901 使用的緩衝區
22. 1221 的 PLE 和 09:57:46 的 7961 使用的緩衝區
23. PLE 在 1282 和使用的緩衝區在 8012 在 09:58:46
24. 11 點的 PLE 和 09:59:46 的 313 點使用的緩衝區
25. PLE 在 31 和已用緩衝區在 966 在 10:00:46
26. PLE 為 90,使用的緩衝區為 1580,10:01:47
27. 151 的 PLE 和 10:02:47 的 3072 的已用緩衝區
28. PLE 在 211 和使用的緩衝區在 3152 在 10:03:47
29. PLE 在 271 和使用的緩衝區在 3729 在 10:04:47 

在項目 #24 SQL Server 報告 PLE 從1,282 變為 11。SQL Server 還報告使用的緩衝區從8,012 變為 313

首先,我尋找執行不佳的查詢,並找到了一些固定的(對問題沒有影響)。但是,我沒有發現任何與我遇到 PLE/Buffer 問題的時間相關的問題查詢。此外,如果它是一個執行不佳的查詢,那麼我認為緩衝區將充滿該查詢的數據,而不是空/失去/錯誤。

接下來我認為發生這種情況時虛擬機的記憶體受到限制。但是我已經問過我的系統管理員,他向我保證記憶體不是動態的或以任何方式共享的。(它被分配了什麼,它總是得到。)另外,我每 10 分鐘執行一次這個腳本,當 PLE 報告少於 50 時:

 SELECT * FROM sys.dm_os_sys_memory

當 PLE/Buffers 高和低時,它會報告相同/相似的值。為了完整起見,這裡是上面 #24 之前和之後的值的範例:

total_physical_memory_kb available_physical_memory_kb total_page_file_kb available_page_file_kb system_cache_kb kernel_paged_pool_kb kernel_nonpaged_pool_kb system_high_memory_signal_state system_low_memory_signal_state system_memory_state_desc
20970996 4758672 24378868 7929404 4844160 686076 182752 1 0 可用物理記憶體高
20970996 4743468 24378868 7892632 4845000 686580 182688 1 0 可用物理記憶體高

我檢查了系統健康會話,它沒有顯示任何相關內容。(它所具有的只是模擬故障,它們的時間與 PLE/緩衝區顯示問題的時間無關。

我已經跟踪了這種情況發生的頻率,我看不到模式或將其與任何工作或計劃活動聯繫起來。

這是一個圖表,顯示了 21 小時內的 PLE 和緩衝區:

PLE 和緩衝區超過 21 小時

所以我很難過。我認為問題的核心是緩衝區而不是 PLE。(我認為 PLE 得到了低的錯誤報告,因為所有緩衝區都以某種方式消失了。)

但我想不出任何可能發生這種情況的方式。或者下一步該怎麼做。

我很想就其他要檢查的事情提出建議,或者對這個問題可能是什麼提出建議。

評論中問題的更新:

*那麼,伺服器給了多少記憶體呢?*VM 有 20 GB 的記憶體。

什麼是最大伺服器記憶體?

名稱 值 value_in_use 描述
最大伺服器記憶體 (MB) 13000 13000 最大伺服器記憶體大小 (MB)
最小伺服器記憶體 (MB) 0 16 最小伺服器記憶體大小 (MB)

注意:我剛剛對此進行了一些閱讀,看來這些設置對我的伺服器來說是錯誤的。

*數據庫有多大?*此伺服器上執行著兩個事務數據庫(我正在讓伺服器隔離它們。)它們的大小分別為 383 GB 和 378 GB。

*該伺服器上正在執行哪些其他應用程序和服務?*此伺服器託管我的應用程序的數據。沒有其他東西能擊中它。(我有一個用於報告等的複制操作數據儲存。

什麼是VM技術VM Ware。

*此 VM 是否在僅託管具有類似資源分配的 VM 的主機上執行?*我們公司有很多虛擬機。大小不一。這是最大的之一。

您能否在不必相信他的情況下確認您的系統管理員告訴您的有關記憶體分配的內容? 我不能。我無權使用這些工具。

(根據我的經驗,系統管理員會說很多話來推卸責任並責怪應用程序或其他任何人,如果這意味著他們不需要做任何事情。) 我完全可以理解這種情緒。

我同意*這種模式當然看起來像是嚴重的記憶壓力。*我希望能找到一些東西來證明 SQL 感受到了記憶體壓力。因此,我可以將其發送回系統管理員進行更多研究。

等待時間統計

WaitType Wait_S Resource_S Signal_S WaitCount Percentage AvgWait_S AvgRes_S AvgSig_S
---------------------- ----------- ----------- --------- ---------- ------------ ---------- --------- ---------
PAGEIOLATCH_SH 16250.10 16219.14 30.96 2171649 29.59 0.0075 0.0075 0.0000 
CXPACKET 14214.03 13238.56 975.47 1187935 25.88 0.0120 0.0111 0.0008 
PAGEIOLATCH_EX 6814.59 6806.21 8.38 638725 12.41 0.0107 0.0107 0.0000 
寫日誌 5157.42 4873.44 283.98 3588476 9.39 0.0014 0.0014 0.0001 
備份 2569.51 2538.12 31.39 1704119 4.68 0.0015 0.0015 0.0000 
LCK_M_IX 2477.15 2477.10 0.05 113 4.51 21.9217 21.9213 0.0004 
ASYNC_IO_COMPLETION 2079.99 2079.66 0.33 836 3.79 2.4880 2.4876 0.0004 
備份緩衝器 1807.75 1759.11 48.64 380189 3.29 0.0048 0.0046 0.0001 
IO_COMPLETION 986.23 985.84 0.39 116112 1.80 0.0085 0.0085 0.0000 

正如在此 SE 執行緒中所討論的,並由 OP 確認。

該問題是由於 SQl Server 2012 中的錯誤造成的。該錯誤已在SQL Server 2012 SP1 CU4中修復。或者更安全地說,我建議您應用SQL Server 2012 SP2而不是使用 CU4。

根據 Microsoft Bug 修復詳細資訊

您可能會在 SQL Server 2012 中遇到性能下降的問題。當您檢查 SQL Server 性能監視器工具時,您會看到以下內容:

• SQLServer:緩衝區管理器\頁面預期壽命性能計數器值快速下降。發生此問題時,計數器接近 0。

引用自:https://dba.stackexchange.com/questions/115671