Sql-Server

dbcc memorystatus - VM 上的緩衝池目標高於最大記憶體

  • November 29, 2014

我正在深入研究 sql server 2012 SP2 上的潛在記憶體/配置問題。我偶然發現了一些在性能計數器和 dbcc 記憶體狀態資訊中看起來有點奇怪的東西。這是 dbcc memorystatus 的緩衝池部分的資訊:

在此處輸入圖像描述

如果我正確閱讀內容,則值為 8 KB 頁面的數量。作為 VM 的伺服器總共有 16 GB 的記憶體,而 SQL 伺服器分配的最小/最大值為 12 GB。" Target" 的值32751616讓我知道262GB哪個恰好是 VM 主機中的記憶體總量。如果我檢查伺服器上的“目標頁面”性能計數器,我會看到相同的數字。我猜這暗示著虛擬機配置不正確,但我真正想知道的是 sql 伺服器將如何處理這個問題。它會影響性能/伺服器會嘗試送出比實際可用更多的記憶體嗎?

查看記憶體管理器的情況似乎更正常:

在此處輸入圖像描述

我一直在網上搜尋有關超過最大記憶體的目標緩衝池的資訊,但我無法提出太多建議,因此非常感謝任何輸入。

  • 編輯。添加性能計數器的圖片。 在此處輸入圖像描述

Value Buffer pool target不是 8 KB 頁面,而是Is actually number of pages您正確假設的頁面。因此,根據輸出,目標緩衝池記憶體為 8*32751616,即 249G。這真的很荒謬

原因:

現在,為什麼 Bpool 目標在 DBCC MEMORYSTATUS 中顯示值 250 G 並且記憶體管理器顯示 12 G 作為目標已送出是因為 Counter SQL Server Buffer Manager: target Pages 從 SQL Server 2012 起已棄用。Microsoft 沒有在任何地方特別提到這一點,但我從SQL Server Buffer Manager Object BOL Document中找到了它。如果您閱讀本文,您將找不到反目標頁面,因為它已被棄用。您還會在 SQL Server 2008 R2 中看到相同的計數器。

其他原因可能是我假設您的系統是帶有 NUMA 節點的 NUMA 系統。我敢肯定,如果您看到 MEMORYSTATUS 輸出,它將對 Node0、Node 1…Node 64 等各種節點進行記憶體分配故障。因此目標包括所有 NUMA 節點的目標記憶體分配。如果您在 MEMORYSTATUS 輸出中註明 Buffer pool,它只有一個條目,並且不限於特定節點。另外,這個值是在啟動期間計算的,does not actually shows correct value after a period of time所以你不應該參考它。而是參考記憶體管理器輸出

在此處輸入圖像描述

編輯:

根據有關buffer pool target pages on NUMA node相信我的問題,它沒有顯示緩衝池的正確值。對於具有 4 G RAM 的系統,目標頁面是 7979008,系統上幾乎沒有執行任何內容。這完全是荒謬的,我要求你不要看這個櫃檯。我與該領域的一位專家進行了交談以確認該行為,他告訴我您應該避免在 NUMA 系統上查看緩衝池輸出和目標頁面,其計算(計算方式)不正確。我可以提出一個連接項目,但需要幾個月才能得到 MS 團隊的回复。

並非 DBCC MEMORYSTATUS 輸出中的每一件事對普通使用者都很重要,許多事情是 MS 內部的,他們不會提供任何有關相同的資訊。如果您想監控 SQL Server 記憶體使用情況,請使用以下查詢。

select
(physical_memory_in_use_kb/1024)Memory_usedby_Sqlserver_MB,
(locked_page_allocations_kb/1024 )Locked_pages_used_Sqlserver_MB,
(total_virtual_address_space_kb/1024 )Total_VAS_in_MB,
process_physical_memory_low,
process_virtual_memory_low
from sys. dm_os_process_memory

如果您真的想監視 SQL Server 目標記憶體,我建議您查看

**SQLServer:記憶體管理器–目標伺服器記憶體:**這是 SQL Server 嘗試獲取的記憶體量。

SQLServer:memory Manager–Total Server memory這是 SQL Server 獲得的目前記憶體。

您還可以從This Link獲得其他計數器。

很少有其他有趣的計數器是

Page reads/sec – 每秒發出的物理數據庫頁面讀取數。此統計數據顯示所有數據庫中的物理頁面讀取總數。由於物理 I/O 很昂貴,​​您可以通過使用更大的數據記憶體、智能索引和更高效的查詢,或者通過更改數據庫設計來最小化成本

Free List Stalls/sec – 每秒必須等待空閒頁面的請求數

PS:如果我遺漏了什麼或者有什麼不清楚的地方,請告訴我

編輯:這是您的問題的連接項,讓我們等待 MS 人員對此的看法。請投票

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