SQL Server 2008 R2“虚拟内存”?


12

我们有一台专用的SQL Server 2008 R2计算机,它遇到一些奇怪的内存问题。该计算机本身具有大量资源,包括两个四核处理器,16GB RAM和64位Windows Server 2008 R2 Enterprise(它是Dell PowerEdge 2950) 。

奇怪的问题是系统报告正在使用的内存为82%,而sqlservr.exe仅报告了使用的内存为155mb。我怀疑SQL Server是问题的原因是因为如果重新启动sqlservr.exe进程,则一段时间内内存消耗将恢复正常。

有人对我如何开始追踪此问题有任何想法吗?

谢谢,杰森


3
您是否正在使用“内存中的锁定页面”用户权限?如果是这样,任务管理器将不会报告锁定的内存。有关更多信息,请参见blogs.technet.com/b/askperf/archive/2008/03/25/…
马克·拉斯穆森

我们已将“内存中的锁定页面”用户权限设置为“无”。我们还在默认的int.MaxValue上设置了“最大服务器内存(以MB为单位)”设置-您认为这可能会引起问题吗?
typefragger

4
我唯一需要担心的是,当我的sql服务器使用LESS的比例低于82%!
SqlACID

Answers:


15

如果运行该服务的帐户具有“内存中的锁定页面”特权,则您将无法从任务管理器中获得真实的内存使用情况(编辑:根据Mark Rasmussen的评论/链接)。要确定正在使用多少内存,可以查看:

  • SQLServer:内存管理器\总服务器内存性能计数器
  • DMV

我不记得是否有DMV或两者的组合会给您总的内存分配,但是下面将显示它的大部分。

SELECT TOP(10) [type] AS [Memory Clerk Type], SUM(single_pages_kb) AS [SPA Mem, Kb] 
FROM sys.dm_os_memory_clerks 
GROUP BY [type]  
ORDER BY SUM(single_pages_kb) DESC OPTION (RECOMPILE);

SELECT DB_NAME(database_id) AS [Database Name],
COUNT(*) * 8/1024.0 AS [Cached Size (MB)]
FROM sys.dm_os_buffer_descriptors
WHERE database_id > 4 -- system databases
AND database_id <> 32767 -- ResourceDB
GROUP BY DB_NAME(database_id)
ORDER BY [Cached Size (MB)] DESC OPTION (RECOMPILE);

第二个通常是最有趣的,按数据库分配缓冲池。这是使用狮子共享的地方,了解哪个数据库是最大的使用者可能很有用。


哇,非常感谢你!这(尤其是第二个)对我来说很清楚!
typefragger

8

当我们的任务管理器无法正确显示SQLServer及其附加服务消耗的内存时,我们自己的Brent Ozar最近发表了一篇文章,探讨了这种情况。您可以在这里找到它:《 Microsoft SQL Server内存的系统管理员指南》

Quote:“ 为什么SQLServer.exe不使用太多内存?

当您将桌面远程连接到服务器并查看任务管理器时,sqlservr.exe的“内存使用情况”似乎总是很古怪。那不是SQL Server的错。 任务管理器是一个肮脏,肮脏的骗子。 (我知道,这听起来像是SQL家伙在怪罪,但请耐心等待一秒钟。)在64位盒上,此数字更为准确,但在32位盒上,它完全是基准。 。为了真正准确地了解SQL Server正在使用多少内存,您需要一个类似Process Explorer的工具,并且需要标识所有SQL Server进程。在右侧显示的服务器中,有两个SQL Server实例(由sqlservr.exe显示),以及SQL代理,SQL浏览器和SQL Server备份工具。同样常见的是,SQL Server Analysis Services,Integration Services和Reporting Services也运行在同一服务器上-所有这些服务器都占用内存。

那么,SQL使用多少内存?我会为您方便的。SQL Server正在使用所有内存。期。”

因此,我建议您尝试Mark的查询,并使用更好的工具进行内存报告。或者只是信任Perfmon报告内存,而不是Task Manager。


-2

如任务管理器中所示,SQL使用的内存量将主要是最大内存设置。最小/最大设置是这样的:

SQL Server启动时,它将开始占用内存直至最小内存设置。随着SQL需求的增加,SQL将开始使用更多的内存,直到最大内存设置。然后,即使SQL使用率下降,内存也会保持在此(最大)点。这给人以SQL执行大型任务并占用大量内存的印象。实际上,该内存是由SQL保留的。

当服务器上存在非SQL内存压力时,SQL会将内存释放到最小内存设置点。这就是使用内存设置的方式。您可以使用Mark的脚本来查看SQL如何使用此内存。


1
最小/最大控制缓冲池分配,仅此而已。这是BOL 中服务器内存选项描述的第一行。这些设置与任务管理器中显示的设置完全没有关系。布伦特对taskmgr的描述是“肮脏,肮脏的骗子”,它概括了我所读过的情况以及所有情况。
Mark Storey-Smith,

@ MarkStorey-Smith请在您自己的评论的链接中进一步阅读内容,这将进一步说明我的观点。任务管理器显示系统资源的使用情况。缓冲池不是系统资源。我正在解释任务管理器中显示的SQL内存使用的含义。您通过提及缓冲池来说明显而易见的内容,但这仍然不能证明我错了。
StanleyJohns,2011年

不确定如何更好地放置它……“任务管理器中显示的SQL使用的内存量主要是最大内存设置。这是最小/最大设置的工作方式”。没错
Mark Storey-Smith,

“这是最小/最大设置的工作方式:”最后有一个冒号,表示在后面进行解释,而不是断言前一句话。:)
StanleyJohns 2011年

1
我和马克在一起。阅读 Slava Oks博客:他是编写内存管理器的MS团队的成员。转到标题“缓冲池”。我引用“记住SQL Server有两个内存设置,您可以使用sp_conifigure进行控制。它们是服务器的最大和最小内存。我不确定是否知道,但是这两个设置确实控制着缓冲池的大小。它们不能控制总体SQL Server占用的物理内存量”
gbn
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.