Sql-Server

所有記憶體管理員和總伺服器記憶體 (KB) 的總和

  • June 16, 2020

我正在嘗試了解 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)?

編輯: select * from sys.dm_os_process_memory 的結果 在此處輸入圖像描述 在此處輸入圖像描述

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 中的所有記憶體分配(他們做了大部分)然而)。

如果您還有其他問題,請告訴我。

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