Ray*_*and 5 memory sql-server-2012
我将 SQL Server 2012 Standard 放在一个虚拟机 (VMWare) 上,该虚拟机具有大约 98GB 的内存。
现在我检查了下面的查询 SQL Server 占用了多少内存。
Microsoft SQL Server 2012 - 11.0.5058.0 (X64)
Run Code Online (Sandbox Code Playgroud)
并且看到他已经吃掉了 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
Run Code Online (Sandbox Code Playgroud)
SQL Server 2012 Standard 应仅支持 64GB 内存。
为什么我的 SQL Server 吃的比他能吃的多?还是信息不正确?
任何的想法?这与使用虚拟内存的虚拟机有关吗?
我不知道 VM 主机上是否激活了气球驱动程序...
如果您需要更多信息,我会添加它。
Aar*_*and 13
64GB 限制(2014 年为 128GB)仅适用于缓冲池。知识库文章“ SQL Server 2012 中的内存配置和大小调整”说:
从 SQL Server 2012 开始,这些内存限制仅对数据库缓存(缓冲池)实施。
而且众所周知,SQL Server 的内存max server memory
也不能控制所有。官方文档正在更新中,以提供以下指导(此确切措辞由 Bob Ward 提供):
服务器级
max server memory
设置控制 SQL Server 内存分配,包括缓冲池、编译内存、所有缓存、qe 内存授予、锁管理器内存和 clr 内存(基本上是 中找到的任何“书记员”sys.dm_os_memory_clerks
)。线程堆栈、内存堆、除 SQL Server 之外的链接服务器提供程序的内存或由“非 SQL Server”DLL 分配的任何内存不受最大服务器内存控制。
因此,它是十分可行的,你将看到sqlservr.exe
使用更超过64GB的内存,如果有比缓冲池以外的任何显著分配,甚至在标准版(和1GB以上,即使在高速版)。
如果您想阻止 SQL Server 使用超过 64GB 的内存,则需要设置max server memory
为小于 64GB(您可能需要在此处进行试验以找到正确的组合,但要了解非缓冲池内存可能会波动,因此您可能仍然会看到超出许可限制和配置限制的内容)。
或者,您可以保持原样,并感谢您最多可以将 64GB 用于缓冲池,还有很多其他东西可以用于其他事情,如果 64GB 限制是强制的硬上限,则可能会减少缓冲池的使用。
您可以看到内存是如何以各种方式分布的。在内存管理员中,您可以使用:
SELECT [type], mem_MB = pages_kb/1024
FROM sys.dm_os_memory_clerks
ORDER BY pages_kb DESC;
Run Code Online (Sandbox Code Playgroud)
在大多数情况下,最大的消费者将是MEMORYCLERK_SQLBUFFERPOOL
,但您也应该看到CACHESTORE_*
条目的数量很大。您可以使用以下内容在更高级别对其进行分组:
SELECT [type] = COALESCE(SUBSTRING([type],1,CHARINDEX('_',[type])-1),'-- total'),
SUM(pages_kb/1024)
FROM sys.dm_os_memory_clerks
GROUP BY GROUPING SETS((),SUBSTRING([type],1,CHARINDEX('_',[type])-1));
Run Code Online (Sandbox Code Playgroud)
要查看缓存/用户存储内存是如何分布的:
SELECT [type], name,
mem_MB = CONVERT(DECIMAL(19,2),pages_kb/1024.0)
FROM sys.dm_os_memory_cache_counters
ORDER BY pages_kb DESC;
Run Code Online (Sandbox Code Playgroud)
目前,在我的低级虚拟机上,您问题中的查询(由@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
以尝试将其拼凑在一起(并且Tim Chapman 编写了一些 PowerShell 以使其更容易),但这值得吗?所有的记忆都在那里报告吗?我不是 100% 肯定它是(或者你应该在 NUMA 系统中使用输出),或者任何 DMV 都可以提供 SQL Server 正在使用的所有内存的完全准确的图片。我也不相信所有的内存管理员类型都被记录在任何地方——所以即使这给出了一个完整的画面,你可能仍然对结果的真正含义感到困惑。
与此同时,任务管理器表示sqlservr.exe
仅使用 42 MB。无论您做什么,请停止使用任务管理器。对于任何事情,真的。我知道您在最近的编辑中已从您的问题中删除了此详细信息,但我不能再强调它对于显示 SQL Server 内存使用情况有多么无用。
归档时间: |
|
查看次数: |
9301 次 |
最近记录: |