為什麼 SQL Server 不使用 Max Server Memory 設置?
我有一台具有以下功能的 SQL Server 機器:
- Windows 2003 企業版 SP2(32 位)
- SQL Server 2005(32 位)
- 12GB 記憶體
- /PAE 開關在 boot.ini 中設置
- 6 個 SQL 實例,全部啟用 AWE
- 機器上沒有執行其他應用程序。
我將最大伺服器記憶體使用量設置為我認為可以接受的值(大約 10GB 組合,為 Windows 留下 2GB)。我正在使用以下查詢來顯示緩衝池和非緩衝池的總 RAM 使用情況。我還展示了 MAX SERVER MEMORY 設置。每個實例上的數據庫都比分配的 RAM 大得多,儘管有幾個實例比其他實例使用得更多。實際使用的記憶體不應該總是非常接近 MAX SERVER MEMORY 設置嗎?我發現了一個讓我好奇的差距。
DECLARE @TotalRam as decimal (10,2) --NON-BUFFER POOL SET @TotalRam = (SELECT sum(pages_allocated_count)/128.0 [Non-Buffer (MB)] from sys.dm_os_memory_cache_entries where pages_allocated_count > 0) --BUFFER POOL SET @TotalRam = @TotalRam + ( SELECT CAST(COUNT(*) * 8/1024.0 AS DECIMAL (10,2)) AS [Buffer Pool (MB)] FROM sys.dm_os_buffer_descriptors WITH (NOLOCK) WHERE database_id > 4 AND database_id <> 32767 ) SELECT @TotalRam as RAMinUSE, value as MaxServerMemory FROM sys.configurations WHERE name like '%max server memory%'
查詢結果:
我想為這台機器增加 12GB 的 RAM 用於兩個重型實例,我想確保它會被使用並且我沒有配置不正確的東西。我已驗證安裝的 SQL 和 Windows 版本將支持 24GB RAM。
看到這些值之間的差距是否正常?也許我的查詢遺漏了一些東西。
你們看到從 12GB 到 24GB 記憶體有什麼問題嗎?
此外,PerfMon 中剩餘的可用 MBytes 顯示大約 600MB。那個數應該是根據MAX SERVER MEMORY分配後剩下的吧?否則,我會期望看到更高的水平。
在您實際將數據載入到記憶體中之前,實際使用的記憶體不會增加。它不會跳到 10GB 的組合分配,因為這是您設置的最大記憶體,並且因為您的數據庫至少有那麼大。這是一個最大值,而不是最小值(更不用說 min 也不是那樣工作的),並且它不會試圖猜測 - 在你執行足夠的查詢之前 - 它應該將哪些表/索引載入到緩衝區中池記憶體。
所以是的,看到這些值的差距是正常的。如果通過在每個實例上發出一堆來抽取緩衝池,您可能會更接近最大值
SELECT * FROM dbo.BiggestTables;
,但通常最好讓 SQL Server 根據實際應用程序的實際使用情況分配它認為合適的記憶體。還要記住,最大伺服器記憶體不僅僅涵蓋緩衝池。簡而言之,SQL Server 非常擅長記憶體管理;讓它做它的事情,當你有一個實際的性能問題時,擔心調整你的各種實例的最大記憶體。