我一直错误地SELECT * FROM sys.dm_os_performance_counters WHERE counter_name LIKE 'Stolen Server Memory%';
认为操作系统从 SQL Server 窃取了多少内存。根据文档,事实是
指定服务器用于数据库页面以外的目的的内存量。
我认为它的意思是“SQL Server(即不是操作系统)用于除缓冲池之外的任何内容的内存量”。
考虑到这一点,检查sys.dm_os_performance_counters
我是否已经在检查还有什么意义吗SELECT * FROM sys.dm_os_memory_clerks ORDER BY pages_kb DESC
?鉴于缓冲池始终位于该列表的顶部(如果不是,您的服务器就注定失败),确定它没有使用多少内存应该是一个简单的算术问题。
我怀疑我的想法是错误的,因为这两个数字在我的服务器上不匹配。然而,我不知道如何找出原因。
-- Total stolen memory.
SELECT top (1) cntr_value
FROM sys.dm_os_performance_counters
WHERE counter_name LIKE 'Stolen Server Memory%'
ORDER BY cntr_value desc;
-- Total memory not in buffer pool.
-- Should be the same as the above but is always less on my machine.
SELECT SUM(pages_kb)
FROM sys.dm_os_memory_clerks
WHERE [Type] <> 'MEMORYCLERK_SQLBUFFERPOOL';
被盗内存不仅仅是除了缓冲池中的内存之外的所有内存。值得注意的是,计划缓存不会被算作被盗内存。
这里有一个类似的问题,解释了被盗内存的内容。这也链接到这个问题。
官方文档似乎很少介绍有关被盗内存及其内容的详细信息。这个解释来自一篇旧的支持文章。
被盗内存对于监控很有用 - 它可以突出显示您的缓冲池受到限制,这可以为某些性能问题提供解释。如果您还监视 sys.dm_os_memory_clerks,您应该能够准确地计算出内存的去向。
例如,MEMORYCLERK_SQLQERESERVATIONS 使用大量内存表示该内存已被内存授予使用。
DBA Dash是我创建的免费开源监控工具,可跟踪性能计数器,包括被盗页面。它还保留 sys.dm_os_memory_clerks 的历史记录。这使您可以回到过去并诊断与内存相关的性能问题。