Sql-Server

緩衝區大小改變?

  • September 24, 2015

我有一個生產數據庫,該數據庫遇到頁面預期壽命 (PLE) 問題的劇烈波動。(它會隨機崩潰為零。)

我一直在研究 PLE 問題,發現一些似乎指向 VMWare 問題的東西,但我不確定我是否正確使用了數據。好像我正在失去緩衝區/記憶體頁面。

我正在使用這個查詢:

SELECT  COUNT(*) AS cached_pages_count, 
       CASE database_id
           WHEN 32767 THEN 'ResourceDb'
           ELSE DB_NAME(database_id)
       END AS database_name
FROM    sys.dm_os_buffer_descriptors
GROUP BY DB_NAME(database_id), database_id
ORDER BY cached_pages_count DESC;

(在這裡找到)

我在 PLE 崩潰之前和之後匯總結果(計數)。一個例子是之前的 1,097,820 和之後的 131,394。所以我似乎“失去”了 966,426 頁。

我的猜測是所有虛擬機的硬體都處於壓力之下,所以它會在一段時間內隨機從伺服器換出一些記憶體。(這只是一個猜測。)當這種情況發生時,所有頁面都失去了,所以 PLE 直線下降。

那麼,我sys.dm_os_buffer_descriptors是否正確使用了視圖? 從我閱讀的內容來看,它總是顯示使用過的緩衝區/記憶體頁面。因此,如果它是空的(或顯著減少),我要麼不再有記憶體,要麼它是空的。(我很想用一種方法來證實這個結論。)

或者還有其他解釋為什麼計數下降這麼多?

該行下方的資訊是從 OP 的評論中添加的


我們的系統管理員管理虛擬機。我希望在我帶著這些數據去找他們之前了解我的查詢。從數據庫的角度來看,PLE 崩潰的時間似乎是隨機的。(在 PLE 崩潰期間不會發生重新索引或其他高性能的事情)

我做了很多工作,看看它是否與工作量有關。雖然有一個性能不佳的查詢,但用完所有記憶體是不夠的。

$$ There is $$ 當緩衝區計數下降時,伺服器上沒有重建或其他非正常使用者活動。即使是這樣,我會不會在上面的查詢中看到它被使用?(意思是如果它是一個 SQL Server 操作,計數不會保持不變,只是使用不同的東西嗎?) 我無權訪問 VMWare 設置。我希望在讓那些這樣做的人參與之前更好地理解我的發現。這個問題的重點是確保我首先正確使用視圖。

在評論鏈的末尾:

我想說的是 PLE 問題導致我失去了 Buffer Pages 問題。我用來獲取 PLE 的查詢將顯示低 PLE,因為頁面失去了。所以他們裡面的東西都沒有了。這是一個錯誤的讀數,因為記憶體量減少了。

這是我的@@版本:

Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64) 
   Dec 28 2012 20:23:12 
   Copyright (c) Microsoft Corporation
   Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)

問:我的生產數據庫遇到頁面預期壽命 (PLE) 問題的劇烈波動。(它會隨機崩潰為零。)

讓我問你什麼是輸出Select @@Version。您的 SQL Server 修補到的 SP 和 CU 級別是什麼。我問這個的原因是因為 SQl Server 2012 中有一個錯誤,它迫使 PLE 像你所觀察到的那樣直線下降。此錯誤已在SQL Server 2012 SP1 CU4中修復。或者更安全地說,我建議您應用SQL Server 2012 SP2而不是使用 CU4

PLE 在具有高活性的系統上波動有時是正常的。實際上,這正是 PLE 程式碼在 SQL Server 中的工作方式。但它經常下降到零的事實讓我相信你可能遇到了我上面提到的錯誤。

根據 Microsoft Bug 修復詳細資訊

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

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

系統上的 PLE 衡量緩衝池的波動程度,它還衡量 SQL Server 中的 I/O 活動量。MSDN 說

頁面預期壽命 - 表示頁面將在沒有引用的情況下停留在緩衝池中的秒數

相信我,這個定義是不完整的。它以時間的形式描述它,這不是一個完整的定義。我一直注意到它是伺服器上 I/O 活動的度量。I/O 活動越大,BPool 的波動性就越大,從而導致 PLE 波動。

問:我的猜測是所有虛擬機的硬體都處於壓力之下,所以它會在一段時間內從伺服器中隨機交換一些記憶體。

如果您認為是這種情況並且您希望 SQL Server 不會成為此類問題的受害者,則必須確保 SQl Server 服務帳戶具有記憶體特權 (LPIM) 中的鎖定頁面。這不會讓作業系統強制 SQL Server 將其記憶體分頁。如果執行 SQL 服務的帳戶預設為本地系統,則 SQL Server 在 SQL Server 2012 中將具有此權限。

筆記:

  1. 這是一種解決方法。這裡的解決方案是找出對 VM 機器造成*壓力的原因。*你應該解決這個問題。如果您覺得Wmware Balooning是問題所在。您可以使用RAMMAP 工具來跟踪Locked Driver. 在 RAMMAP 工具中,如果您看到 Locked 驅動程序佔用大量記憶體,則表明它是 VMware balooning。從團隊那裡獲得幫助,為執行 SQL Server 的虛擬機配置/禁用氣球
  2. 在提供 LPIM 之前,您必須確保已為最大伺服器記憶體設置了最佳值,並為作業系統留下了足夠的記憶體以高效執行。
  3. 如果您不遵循以上兩點,並且由於 LPIM 導致作業系統面臨嚴重的記憶體壓力,則作業系統程序將被分頁,因為它無法強制 SQL Server 釋放記憶體(由於 LPIM 導致其鎖定/不可分頁),從而導致極大的緩慢作業系統程序。

問:那麼,我是否正確使用了 sys.dm_os_buffer_descriptors 視圖?從我閱讀的內容來看,它總是顯示使用過的緩衝區/記憶體頁面。因此,如果它是空的(或顯著減少),我要麼不再有記憶體,要麼它是空的。(我很想用一種方法來證實這個結論。)

如前所述,緩衝區描述符返回有關目前位於 SQL Server 緩衝池中的所有數據頁的資訊。恕我直言緩衝區頁面are affected by I/O activity on server and thus indirectly related to PLE。如果請求從磁碟獲取大量頁面到記憶體,SQL Server 很可能會在發現需要在緩衝池中創建空間以將新頁面引入記憶體時將數據頁面刷新到磁碟,從而減少特定數據庫的記憶體中存在的數據頁。

因此,您通過 sys.dm_os_buffer_descriptors 看到的內容並不正確,但我希望not suggest您使用緩衝區描述符 DMV 來衡量伺服器上的 PLE。這不是一個正確的方法。

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