Sql-Server

為什麼我的 SQL Server 消耗這麼多記憶體?

  • March 10, 2021

我的測試伺服器中有一個 64GB 的 Windows Server 2019 標準伺服器。

我有 SQL Server 2019 CU9 開發人員版,我的實例消耗了 21,199 MB,如圖所示sql_physical_memory_in_use_MB

我有 4 個使用者數據庫。它們的大小約為 5GB、2GB、400MB 和 200MB。

Mytempdb在實例啟動時配置為 8GB。

我試圖了解為什麼我的實例使用 21GB 記憶體。只是擔心可能的記憶體洩漏。

誰能安撫我的神經?

SELECT
   (CASE WHEN ([database_id] = 32767) THEN 'Resource Database' ELSE DB_NAME (database_id) END) AS 'Database Name',
   SUM(CASE WHEN ([is_modified] = 1) THEN 1 ELSE 0 END) AS DirtyPageCount,
   SUM(CASE WHEN ([is_modified] = 1) THEN 0 ELSE 1 END) AS CleanPageCount,
   count(*)AS TotalPageCount,
   cast(count(*) * 8192.0 / (1024.0 * 1024.0) as decimal(8,2)) as BufferPoolMB
FROM sys.dm_os_buffer_descriptors
GROUP BY database_id
ORDER BY TotalPageCount desc
GO

輸出

SELECT 
   physical_memory_in_use_kb/1024 AS sql_physical_memory_in_use_MB, 
   large_page_allocations_kb/1024 AS sql_large_page_allocations_MB, 
   locked_page_allocations_kb/1024 AS sql_locked_page_allocations_MB,
   virtual_address_space_reserved_kb/1024 AS sql_VAS_reserved_MB, 
   virtual_address_space_committed_kb/1024 AS sql_VAS_committed_MB, 
   virtual_address_space_available_kb/1024 AS sql_VAS_available_MB,
   page_fault_count AS sql_page_fault_count,
   memory_utilization_percentage AS sql_memory_utilization_percentage, 
   process_physical_memory_low AS sql_process_physical_memory_low, 
   process_virtual_memory_low AS sql_process_virtual_memory_low
FROM sys.dm_os_process_memory; 

輸出

SELECT c.value, c.value_in_use
FROM sys.configurations c WHERE c.[name] = 'max server memory (MB)';

為什麼我的 SQL Server 消耗這麼多記憶體?

您正在查看總程序記憶體,以及一個特定的記憶體消費者。從總程序記憶體向下鑽取並獲得 SQL Server 記憶體使用使用的高級分配sys.dm_os_memory_clerks,例如:

select type,name, (pages_kb + virtual_memory_committed_kb + awe_allocated_kb) / 1024. committed_mb
from sys.dm_os_memory_clerks 
order by committed_mb desc 

或老派

dbcc memorystatus

如果您看到大量程序記憶體 (large_page_allocations_kb + locked_pa​​ge_allocations_kb + virtual_address_space_committed_kb) 無法由記憶體管理員解決,請查看是否有任何用於在程序中載入的連結伺服器的 OleDb 驅動程序。它們在 SQL Server 記憶體管理器之外分配記憶體。

記憶體的兩個最大消費者是緩衝池和鎖管理器。除非系統處於記憶體壓力之下,否則這兩者都會分配記憶體並且不會釋放它。

MEMORYCLERK_SQLBUFFERPOOL Client-Default        9801MB
OBJECTSTORE_LOCK_MANAGER  Lock Manager : Node 0 6929MB

所以這就是你的答案。自啟動以來,SQL Server 在某個時候將緩衝池增加到了 9GB,鎖管理器記憶體增加到了 7GB,這在 21GB 中占到了足夠的大小,表明您確實沒有問題。

參見相關:鎖使用的記憶體

我只是擔心為什麼我的實例大小是 21GB。只是擔心記憶體洩漏。誰能安撫我的神經?

冷靜點,這不是記憶體洩漏。您可能設置max server memory了大約 21 GB,或者可能沒有設置全部,SQL Server 將使用 21 GB(這不太可能)。另請注意,一旦 SQL Serve 使用了一個記憶體部分,它就不會釋放,除非它看到某個其他程序需要該記憶體,或者 SQL 資源監視器標記了記憶體不足通知。這就是 SQL Server 記憶體程式碼的編寫方式。您有 5.5 GB 的總數據和幾乎 4 倍的記憶體在某個時間點您的所有數據都將在記憶體中,並且 SQL Server 不會釋放記憶體,因為從記憶體讀取比從磁碟讀取快得多。

閱讀記憶體管理架構指南

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