我将 SQL Server 2012 Standard 放在具有大约 98GB 内存的虚拟机 (VMWare) 上。
现在我检查了下面的查询 SQL Server 占用了多少内存。
Microsoft SQL Server 2012 - 11.0.5058.0 (X64)
并且看到他已经吃掉了 81GB 的内存,并且最大内存设置为 ~90GB。
使用:
select (physical_memory_in_use_kb/1024)Memory_usedby_Sqlserver_MB,
(locked_page_allocations_kb/1024 )Locked_pages_used_Sqlserver_MB,
(total_virtual_address_space_kb/1024 ) VAS from sys. dm_os_process_memory
SQL Server 2012 Standard 应仅支持 64GB 内存。
为什么我的 SQL Server 吃的比他吃的多?还是信息不正确?
任何想法?这与使用虚拟内存的虚拟机有关吗?
我不知道VM Host上是否激活了气球驱动程序...
如果您需要更多信息,我会添加它。
64GB 限制(2014 年为 128GB)仅适用于缓冲池。知识库文章“ SQL Server 2012 中的内存配置和大小调整注意事项”说:
而且众所周知, SQL Server
max server memory
也不会控制所有的内存。官方文档正在更新中,以提供以下指导(此确切措辞由 Bob Ward 提供):因此,即使在标准版中(甚至在快捷版中也超过 1GB),如果有大量分配给缓冲池以外的任何东西,您将看到
sqlservr.exe
使用超过64GB 的内存是非常可行的。如果您想阻止 SQL Server 使用超过 64GB 的内存,则需要设置
max server memory
为小于 64GB 的内存(您可能需要在此处进行试验以找到正确的组合,但要了解非缓冲池内存可能会波动,因此您可能仍然会看到超出许可限制和配置限制的内容)。或者,您可以保持原样,感谢您最多可以将 64GB 用于缓冲池,如果 64GB 限制是强制硬上限,则可能会减少缓冲池使用的其他内容。
您可以看到内存是如何以各种方式分布的。在内存职员中,您可以使用:
在大多数情况下,最大的消费者将是
MEMORYCLERK_SQLBUFFERPOOL
,但您也应该看到大量的CACHESTORE_*
条目。您可以使用以下方法将其分组到更高级别:要查看缓存/用户存储内存是如何分布的:
目前,在我的低级 VM 上,您的问题中的查询(由 @Shanky 提供)表示 SQL Server 正在使用 2,085 MB 内存(其中 2,004 MB 锁定在内存中)。然而,我上面对内存管理员 DMV 的查询说,那里使用的总内存只有 1,793 MB。
Chris 的回答中的查询表明总数为 2,054 MB,目标为 3,072 MB(这是因为我已明确设置
max server memory
为 3,072 MB)。那么额外的〜200 MB在哪里?谁知道。(如果我在性能监视器中进行比较,我也可以看到这种差异
total server memory
。Process > sqlservr > Private Bytes
)我可以开始解析输出DBCC MEMORYSTATUS
以尝试将其拼凑起来(蒂姆查普曼编写了一些 PowerShell 以使其更容易),但这值得吗?所有的记忆都在那里报告吗?我不能 100% 确定它是(或者你应该在 NUMA 系统中使用输出),或者任何 DMV 都可以完全准确地描述 SQL Server 正在使用的所有内存。我也不相信所有的记忆文员类型都记录在任何地方——所以即使这给出了一个完整的画面,你可能仍然对结果的真正含义摸不着头脑。与此同时,任务管理器表示
sqlservr.exe
仅使用 42 MB。无论您做什么,请停止使用任务管理器。对于任何事情,真的。我知道您在最近的编辑中已经从您的问题中删除了这个细节,但我不能强调它对于显示 SQL Server 内存使用情况是多么无用。根据 Aaron Bertrand 的回答(快速查看为 SQL Server 分配了多少 RAM?)。不应使用任务管理器来确定 SQL 实际使用了多少内存。
我更喜欢使用以下查询(再次感谢 Aaron):
或者,使用
DBCC MEMORYSTATUS
将产生此信息(以及大量附加信息)。我发现此查询为我提供了更准确的实际使用总内存 -
我很欣赏这篇文章很旧,但这可能有用。
我有一个 2012 std 的实例,总共使用了一些 120Gb 内存