我进行性能监控的其中一台服务器开始从资源耗尽检测器发出以下警告:
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。
除了资源耗尽检测器警告之外,SQL 还开始出现内存不足错误。
找到根本原因的最佳方法是什么?我在日志中没有看到任何异常。经过几个小时的反复错误,内存终于耗尽,服务开始失败,直到服务必须重新启动。
当有压力时,SQL 难道还不够聪明,无法放弃部分内存吗?页面文件(虚拟内存)为 20GB,而 SQL 只使用了 16GB 的物理内存。剩余的虚拟内存被什么填满了?SQL 真的使用了所有页面文件吗?
我应该检查内存泄漏吗?日志文件增长?
服务器上使用最多的 .mdf 每天增长约 100mb。日志文件每次增长 3gb,现在已达到 40gb。
通常,当内存压力出现时,服务器不会直接崩溃。通常,服务器只是运行缓慢,直到压力消失。
有没有办法可以有效地阻止该问题的发生?
答案1
为了正确诊断这一点,我们需要更多信息。
SQL 服务器与任何其他 Windows 进程一样;它的虚拟地址空间可能远大于物理 RAM。如果它的任何部分使用内存映射文件,它甚至可以大于 RAM + 分页文件。
SQL Server 中的调整参数是一种告诉它永远不要使用超过“x”MB 的方法。您必须查看机箱上所有其他服务的峰值提交费用,从物理 RAM 数字中减去该数字,然后将余数提供给 SQL Server。据我所知,内存上限仅适用于 RDBMS,而不适用于相关的 SQL Server 服务。我可能错了。
因此,我们需要有关剩余进程的更多数据。例如,您有一个 IIS 工作进程占用了 273MB;只有一个工作进程吗?您是否安装了防病毒或备份软件?
您可以使用 WSRM 来分析正在发生的事情,然后考虑应用内存上限。或者,我建议安装更多 RAM。
要以图形方式查看内存的使用情况,请查看 Microsoft SysInternals 的 RAMMap 实用程序。
答案2
有没有办法可以有效地阻止该问题的发生?
最明智的答案是建议你购买更多内存。这可能无法解决你的问题,但可能不会有什么坏处。
SQL Server 喜欢内存。SQL Server 喜欢在内存中缓存您的数据库或数据库块,以便更快地访问它们。如果您想查看内存中现在有什么,您可以从 DMV 中获取该信息: http://www.mssqltips.com/sqlservertip/2393/determine-sql-server-memory-use-by-database-and-object/我的一位同事曾经收到过供应商的建议,即其产品数据库的大小不得超过服务器内存的大小。这对大多数人来说是不切实际的,但如果您试图用 16GB 的 RAM 来提供查询繁重的 10TB 数据库,那么这可能是一个问题。
尝试在您的服务器上运行 sp_blitz——这是一个检查您的服务器是否存在问题的存储过程。 http://www.brentozar.com/blitz/
也可以尝试 perfmon: http://www.brentozar.com/archive/2006/12/dba-101-using-perfmon-for-sql-performance-tuning/
这应该有助于您找到原因。
答案3
您可能需要增加页面文件大小,以便能够处理内存提交大小的间歇性峰值。我们在 Azure 计算中经常遇到此问题,其中页面文件默认设置得太低,不适合内存密集型应用程序。
你可以在这里阅读更多:http://mvolo.com/low-pagefile-can-cause-503-service-unavailable-on-azure-web-roles/
如果您的 SQL 实例需要比您拥有的多得多的内存,这将无法解决问题,但它可以帮助您更好地抵御暂时的峰值。