我们的一台 SQL Server 已经稳定运行了相当长一段时间(数年),但最近出现了内存不足的错误。从应用程序事件日志中,我们可以看到:
事件 ID: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 标准版
答案1
我建议也使用 -g 启动参数。它似乎对大多数人都有效,可能对你也有效。我唯一担心的是,根本问题可能没有得到解决。例如,如果由于链接服务器而导致内存泄漏,并且 MTL 增加到 512Mb,内存问题之间的间隔会不会更长?我不知道答案,但我倾向于同意 UndertheFold 的观点,即 perfmon 可能是一个好的开始。
答案2
错误消息“系统内存不足以运行此查询。”指的是虚拟地址空间(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 的最大内存设置,但我会将此作为最后的手段。
答案3
这可能与链接服务器驱动程序的内存泄漏有关,根据这个论坛帖子:
以下是微软告诉我们的内容。
显然,使用链接服务器(特别是 fox pro 驱动程序)处理数据会导致内存泄漏,而且这种泄漏会随着时间的推移而逐渐增加。
答案4
有不同的方法可以解决这个问题。
第一的,检查 SQL Server 的“最小服务器内存”和“最大服务器内存”设置。如果发现两个值之间的差异很小,请增加“最大服务器内存”。
第二,找到长时间运行的查询及其内存使用信息,如果此查询处于空闲状态,请验证并终止此进程。数据库性能优化对于内存使用来说是一件大事。
第三,发现长时间运行查询的索引使用情况,因为如果没有适当的索引,系统磁盘 I/O 就会增加,并直接影响您的内存。
第四,检查虚拟内存分页文件的大小并增加该文件的大小。
第五,检查“每个查询的最小内存”的大小,实际上默认情况下它为 1024 KB,但在极少数情况下,您可以减小此参数的大小。实际上,这并不可取,但您可以尝试一下。
第六,尝试执行此 DBCC 命令,但同样不建议这样做,因为它可能会影响服务器的整体性能。但您可以尝试一下。