如何findSQL Server 2008上内存压力故障的根本原因?

我一直在进行性能监控的服务器之一,开始从资源耗尽探测器发出以下警告:

Windows成功诊断出虚拟内存不足的情况。 以下程序消耗的虚拟内存最多:sqlservr.exe(1560)消耗了14960812032个字节,ReportingServicesService.exe(1936)消耗了506359808个字节,w3wp.exe(7376)消耗了273764352个字节。

SystemCommitLimit 38068215808 SystemCommitCharge 37800669184 ProcessCommitCharge 16727490560 PagedPoolUsage 359088128 PhysicalMemorySize 17098584064 PhysicalMemoryUsage 16881131520 NonPagedPoolUsage 221425664进程48

这个服务器是windows server 2008,运行MSSQL 2008 R2,有16GB的RAM和24个处理器。 它运行SQL,并为数据访问SQL的Web服务。

我引用的数字来自事件查看器的详细信息部分。 我一直无法找出根本原因。 我已经知道SQL需要大量的内存来运行,而且当时使用了大量的内存,但是我也把它设置为14000MB。

除Resource-Exhaustion-Detector警告外,SQL开始出现Out of Memory错误。

find根本原因的最佳方法是什么? 我没有看到任何在日志中看起来不寻常的东西。 经过几个小时的这个错误重复一遍又一遍,内存终于耗尽,服务开始失败,直到服务不得不重新启动。

当有压力的时候,SQL是不是聪明地放弃了一些内存呢? 页面文件(虚拟内存)是20GB,而SQL只使用了16GB的物理内存。 什么填补了虚拟内存的其余部分? SQL实际上是使用所有的页面文件?

我应该寻找内存泄漏吗? 日志文件增长?
服务器上使用最多的.mdf每天增长大约100MB。 日志文件一直在增长3GB,现在是40GB。

通常当有内存压力时,我们从来没有到达服务器崩溃的地步。 它通常只是缓慢地运行,直到压力消失。

有没有办法有效地阻止这个问题的发生?

为了正确诊断,我们需要更多的信息。

SQL服务器就像其他Windows进程一样; 它的虚拟地址空间可以比物理RAM大得多。 它甚至可以比RAM +分页文件大,如果它的任何部分使用内存映射文件。

SQL服务器中的调整参数是一种告诉它永远不会使用超过“x”MB的方法。 您必须查看框中所有其他服务的峰值承诺费用,从您的物理RAM数据中减去此数额,然后将其余部分提供给SQL Server。 据我所知,内存上限只适用于RDBMS,而不适用于相关的SQL服务器服务。 我可能在这里错了。

所以,我们需要更多的数据来处理剩余的stream程。 例如,你有一个IIS工作进程消耗273MB; 只有一个工人进程? 你有没有安装防病毒或备份软件?

您可以使用WSRM来分析正在发生的事情,然后考虑应用内存上限。 或者,这将是我的build议,安装更多的内存。

要获取内存的graphics视图,请在Microsoft SysInternals的RAMMap实用程序中使用。

有没有办法有效地阻止这个问题的发生?

glib的答案是build议你买更多的内存。 这可能无法解决你的问题,但它可能不会伤害。

SQL Server喜欢内存。 SQL Server喜欢将数据库或数据库块caching在内存中,以便更快地访问它们。 如果您现在想查看内存中的内容,可以从DMV中获取这些信息: http : //www.mssqltips.com/sqlservertip/2393/determine-sql-server-memory-use-by-database-和对象/ 。 我的一位同事曾经收到供应商的build议,即其产品数据库的数据库大小不会超过服务器内存的大小。 这对于大多数人来说是不切实际的,但是如果你想提供一个带有16GB内存的严重查询的10TB数据库,这可能是一个问题。

尝试在服务器上运行sp_blitz – 这是一个存储过程,用于检查服务器是否存在问题。 http://www.brentozar.com/blitz/

也请尝试perfmon: http ://www.brentozar.com/archive/2006/12/dba-101-using-perfmon-for-sql-performance-tuning/

这应该可以帮助你find原因。

您可能需要增加页面文件大小,以便处理内存提交大小中的间歇性尖峰。 在Azure计算中,我们经常遇到这个问题,对于内存密集型应用程序,页面文件的默认设置太低。

你可以在这里阅读更多: http : //mvolo.com/low-pagefile-can-cause-503-service-unavailable-on-azure-web-roles/

如果您的SQL实例需要比您更多的内存,这不会解决问题,但它可以帮助您更好地应对临时高峰。