為什麼我的 SQL Server 消耗這麼多記憶體?
我的測試伺服器中有一個 64GB 的 Windows Server 2019 標準伺服器。
我有 SQL Server 2019 CU9 開發人員版,我的實例消耗了 21,199 MB,如圖所示
sql_physical_memory_in_use_MB
。我有 4 個使用者數據庫。它們的大小約為 5GB、2GB、400MB 和 200MB。
My
tempdb
在實例啟動時配置為 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_page_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 不會釋放記憶體,因為從記憶體讀取比從磁碟讀取快得多。