所有記憶體管理員和總伺服器記憶體 (KB) 的總和
我正在嘗試了解 SQL Server 的記憶體管理。我在具有 64 GB RAM 的虛擬環境中有一個 Windows Server 2019。我還安裝了最大伺服器記憶體 59776 MB 的 SQL Server 2019。通過使用以下查詢,我找到了所有記憶體管理員的列表:
SELECT [type] AS [ClerkType], SUM(pages_kb) / 1024 AS [SizeMb] FROM sys.dm_os_memory_clerks WITH (NOLOCK) GROUP BY [type] ORDER BY SUM(pages_kb) DESC
所有記憶體職員的總和等於 23523 MB。
Value for MEMORYCLERK_SQLBUFFERPOOL memory clerk is 18387 MB.
我還檢查了一些性能計數器:
Total Server Memory (KB) = 32262 MB. Database Cache Memory (KB) = 18387 MB.
如果以下任何陳述有誤,請糾正我,
Max Server Memory for SQL Server 2019 = Buffer Pool Memory + Non-Buffer Pool Memory. Total Server Memory (KB) - The committed memory from the Buffer Pool. Data Cache Memory (KB) performance counter is equivalent to MEMORYCLERK_SQLBUFFERPOOL memory clerk and both represents data cache used size. Above query shows all memory clerks for both Buffer Pool Memory and Non-Buffer Pool Memory.
我的問題與這個主題有關:
如果 Total Server Memeory (KB) 與 Buffer Pool 記憶體有關,那麼為什麼它的大小 (32262 MB) 大於代表 Buffer Poll Memory 和 Non-Buffer Pool Memory 的 Total sum memory clerks (23523 MB)?
SQL Server 2019 的最大伺服器記憶體 = 緩衝池記憶體 + 非緩衝池記憶體。
不,SQL Server 2019 的某些記憶體分配可以在最大伺服器記憶體之外完成,例如(我會引用記憶體管理架構指南)
執行緒堆棧1、CLR2、擴展過程 .dll 文件、分佈式查詢引用的 OLE DB 提供程序、Transact-SQL 語句中引用的自動化對像以及非 SQL Server DLL 分配的任何記憶體都不受最大伺服器記憶體控制。
所以你可以看到記憶體的一部分分配在最大伺服器記憶體之外,所以你的等式並不總是成立。
總伺服器記憶體 (KB) - 來自緩衝池的已送出記憶體。
是的,這是使用記憶體管理器送出的記憶體。
數據記憶體記憶體 (KB) 性能計數器等效於 MEMORYCLERK_SQLBUFFERPOOL 記憶體管理員,兩者都表示數據記憶體使用的大小。
不,緩衝池更大,數據記憶體是它的子集。
如果 Total Server Memeory (KB) 與 Buffer Pool 記憶體有關,那麼為什麼它的大小 (32262 MB) 大於代表 Buffer Poll Memory 和 Non-Buffer Pool Memory 的 Total sum memory clerks (23523 MB)?
伺服器總記憶體基本上包括 SQL Server 使用的記憶體,幾乎是 31 GB,這將大於職員的總和,基本上是 22 GB,因為記憶體職員不會擷取SQL Server 中的所有記憶體分配(他們做了大部分)然而)。
如果您還有其他問題,請告訴我。