我有一台具有以下功能的 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 非常擅长内存管理;让它做它的事情,当你有一个实际的性能问题时,担心调整你的各种实例的最大内存。