我们的一台 SQL Server 已经稳定运行了一段时间(几年),最近出现了内存不足的错误。从应用程序事件日志中,我们看到:
事件编号:701
说明:系统内存不足,无法运行此查询。
我们管理此服务器的团队主要由兼任系统管理员职责的开发人员组成。然而,我们的主要专长是开发。话虽如此,我们对如何解决此问题感到茫然。我们一直在搜索论坛和诸如此类的东西,但没有找到任何匹配的东西
因此,这里有一些详细信息可帮助进行故障排除:
- 我们的最小服务器内存设置为 0。
- 我们的最大服务器内存设置为 2000。
- 总物理内存为 3,325.85 MB(来自 sysinfo)。
- 总虚拟内存为 7.10 GB(来自 sysinfo)。
- 我们没有使用 AWE 来分配内存,但我们现在要看看它是否会有所作为。
- 此错误是由备份事务日志的作业引发的,而不是运行查询。
- 我们有许多链接服务器。另一边的 RDBMS 类型是 SQL Server(2005 和 2000)、Oracle 10g 和 OSI PI 系统。
- 此时是断断续续的。我们似乎无法将任何时间或事件与错误相关联。
- 当然,重新启动似乎会使它消失一段时间,由于错误消息的性质,这是有道理的。
- 该服务器三倍于应用程序服务器(几个 Windows 服务)和 Web 服务器以及数据库服务器。
编辑:
我们在 SP3 上。我们发现的大多数帖子都是 SP1 之前的,这不适用于我们。
SELECT SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')
返回
9.00.4035.00 SP3 标准版
错误消息“系统内存不足,无法运行此查询。” 指的是虚拟地址空间 (VAS) 不可用,而不是传统意义上的内存,即在 SQL Server 进程空间内。
鉴于您在这台服务器上仅运行 3GB,而 SQL Server 已分配到 2GB,这意味着操作系统以及更重要的是盒子上的其他任何东西都只有不到 1GB 的空间可供使用。这不是很多内存。
如果这个问题确实是内存泄漏的结果,那么它是正在消耗 SQL Server 进程空间 (memToLeave) 之外的 VAS。
我建议使用 -g 启动参数为 memToLeave 部分分配更多内存。
有关详细信息,请参阅以下文章:
http://www.johnsansom.com/sql-server-memory-configuration-determining-memtoleave-settings/
您可能还希望减少 SQL Server 的最大内存设置,但我会将此作为最后的手段。
我建议也使用 -g 启动参数。它似乎适用于大多数人,并且可能也适用于您。我唯一担心的是根本问题可能无法解决。例如,如果由于链接服务器而导致内存泄漏,并且 MTL 增加到 512Mb,那么内存问题之间的时间会更长吗?我不知道答案,但我倾向于同意 UndertheFold 的观点,因为 perfmon 可能是一个好的开始。
根据此论坛帖子,这可能与链接服务器驱动程序的内存泄漏有关:
我会设置你的最小内存 - 这些其他进程很可能正在从 SQL 中“窃取”内存
您可以使用 perfmon 运行计数器日志来确认这一点和/或给自己更多信息来确定真正的问题是什么。
参考来自这个博客!
有不同的替代方案来解决这个问题。
首先,检查 SQL Server 设置的“min server memory”和“max server memory”。如果您发现这两个值的差异非常小,请增加“最大服务器内存”。
其次,发现长时间运行的查询及其内存使用信息,如果该查询处于空闲状态,请验证并终止该进程。数据库性能优化是内存使用的主要内容。
第三,找出长时间运行查询的索引用法,因为没有正确索引您的系统 DISK I/O 会增加,并直接影响您的内存。
四、检查虚拟内存分页文件的大小,增加这个文件的大小。
第五,检查“min memory per query”的大小,实际上它默认为 1024 KB,但在极少数情况下,您可以减小此参数的大小。实际上,这是不可取的,但您可以尝试一下。
第六,尝试执行此 DBCC 命令,同样不建议这样做,因为它可能会影响服务器的整体性能。但是你可以试试这个。