Windows successfully diagnosed a low virtual memory condition. The
following programs consumed the most virtual memory: sqlservr.exe
(1560) consumed 14960812032 bytes,ReportingServicesService.exe (1936)
consumed 506359808 bytes,and w3wp.exe (7376) consumed 273764352
bytes.SystemCommitLimit 38068215808
SystemCommitCharge 37800669184
ProcessCommitCharge 16727490560
PagedPoolUsage 359088128
PhysicalMemorySize 17098584064
PhysicalMemoryUsage 16881131520
NonPagedPoolUsage 221425664
Processes 48
该服务器是运行MSsql 2008 R2的Windows Server 2008,具有16GB的RAM和24个处理器.它运行sql,以及访问sql for Data的Web服务.
我在报价中包含的数字来自事件查看器的详细信息部分.我无法找出根本原因.我已经知道sql需要大量的内存来运行,当时它使用了大量的内存,但我的上限也设置为14000MB.
除了Resource-Exhaustion-Detector警告之外,sql开始出现Out of Memory错误.
找到根本原因的最佳方法是什么?我没有在日志中看到任何与众不同的东西.经过几个小时的这个错误反复重复,内存终于耗尽,服务开始失败,直到服务必须重新启动.
当有压力时,sql是不是足够智能放弃它的一些内存?页面文件(虚拟内存)为20GB,sql仅使用16GB的物理内存.什么填补了虚拟内存的其余部分? sql实际上是否正在使用所有页面文件?
我应该寻找内存泄漏吗?日志文件增长?
服务器上使用最多的.mdf每天增长大约100mb.日志文件一直增长3GB,现在已经增长了40gb.
通常当存在内存压力时,我们从未达到服务器崩溃的程度.通常只是在压力消失之前运行缓慢.
有没有办法有效地阻止这个问题的发生?
解决方法
sql服务器就像任何其他Windows进程一样;它的虚拟地址空间可能比物理RAM大得多.它甚至可以比RAM页面文件大,如果它的任何部分使用内存映射文件.
sql Server中的调整参数是一种告诉它永远不要使用超过’x’MB的方法.您必须查看包装盒上所有其他服务的峰值提交费用,从物理RAM数字中减去此值,然后将剩余部分提供给sql Server.据我所知,内存上限仅适用于RDBMS,而不适用于相关sql服务器服务的动物.我在这里错了.
因此,我们需要更多剩余流程的数据.例如,你有一个IIS工作进程消耗273MB;只有一个工人流程吗?您是否安装了防病毒软件或备份软件?
您可以使用WSRM来分析正在发生的事情,然后考虑应用内存上限.或者,这是我的建议,安装更多的RAM.
要获得内存运行位置的图形视图,请了解Microsoft SysInternals的RAMMap实用程序.