如何确定哪个应用程序正在泄漏非分页内存?

如何确定哪个应用程序正在泄漏非分页内存?

我们最近在实时服务器上遇到了一个问题,导致我们的 Web 应用停止响应。我们收到的都是 503 错误,直到我们重新启动服务器后才恢复正常。最后我将其追溯到 httperr.log,发现了大量 1_Connections_Refused 错误。

进一步的调查似乎表明我们已经达到了非分页池限制。从那时起,我们一直在使用 Poolmon.exe 监控非分页池内存,我们相信我们已经确定了导致问​​题的标签。

Tag   Type    Allocs       Frees       Diff       Bytes      Per Alloc
Even  Nonp  51,231,806   50,633,533   684,922   32,878,688      48

如果我们使用poolmon.exe /g,它会将映射驱动程序显示为[<未知>事件对象]。

这几乎根本帮不上忙。我的团队花了大量时间研究这个问题,但一直没能找到一个流程来将问题缩小到特定的应用程序或服务。我感觉大多数人似乎通过终止机器上的进程直到他们看到非分页内存重置来解决问题。这并不是您在生产机器上工作时想要看到的。

如果我打开任务管理器并查看进程列表。我看到 MailService.exe 的 NP 池值为 105K,这比第二个进程的值高 36K。由于我们过去遇到过一些邮件服务器问题(可能与此问题有关,也可能无关),我的直觉是这导致了问题。

然而,在我们重新启动服务之前,我希望获得比“直觉”更多的确定性。

我也尝试过使用poolmon.exe /c但这总是返回错误:

unable to load msvcr70.dll/msvcp70.dll

并且它不会创建 localtag.txt。我的同事不得不从互联网上下载pooltag.txt,因为我们不知道它位于何处。我们没有安装 win 调试器或 win DDK(据我所知)。也许出现上述错误是因为我们没有安装其中任何一个 - 但我不知道。

最后我尝试了:

C:\windows\system32\driver\findstr /m /l Even *.sys

这返回了一个相当大的 .sys 文件列表,但对于解决当前的问题没有任何帮助。

我的问题是这样的:还有其他方法可以缩小导致内存泄漏的原因吗?

更新:

如下所述,我在过去一天左右一直在记录池非分页字节数,以查看是否有任何进程呈上升趋势。在大多数情况下,所有进程的使用率似乎都相当稳定。其中两个进程似乎略有上升。我将在接下来的几天继续监控这一点。

我之前还忘了提到,所有进程似乎都没有使用过多的句柄。

更新2:

过去几周我一直在监控这个问题。在此期间,单个进程的非分页字节池和总的非分页字节池都保持相对稳定。在此期间,Windows 进行了更新,服务器也进行了重启,所以我想知道这是否解决了问题。与之前相比,我现在肯定没有看到非分页字节池持续增长。

答案1

我已经监视这个问题大约 6-7 周了,终于可以对这个问题给出明确的答案了。

首先,各个进程的非分页字节数并没有真正告诉我任何有用的信息,因为它们的使用情况似乎都相当稳定。虽然出现了峰值,但之后使用量总会回到基线。

非分页字节内存总量也一度保持稳定,但随后开始逐渐增加,然后出现峰值。峰值过后,大约一半的内存被释放,然后再次保持稳定(在较高级别)一段时间,直到重复这种模式。查看图表时,我注意到这些峰值似乎间隔相当规律,事实证明它们每隔两周出现一次,而且总是在周日。

所以下一个问题是:每两周的周日运行什么?我去事件查看器查看了一下,每次都会出现峰值McAfee 正在运行。我还认为,通过频繁登录服务器来监控问题,我们无意中使问题变得更糟,因为 McAfee 有一个实时扫描仪,我相信这是导致我们看到的增幅较小的原因。

我认为扫描是计划任务也解释了为什么我们看到 NP 内存增加附加在 PoolMon 中的事件对象标签上,而不是 McAfee 特定标签上。这是真正让我们陷入困境的主要原因。

现在我们终于知道了泄漏的原因,我们可以采取一些措施了。不过,令人难以置信的是,花了这么长时间才找到原因。

更新:最后再说一句。McAfee 已于周末更新,这彻底解决了我们的非分页内存问题。

更新2:由于我刚刚获得了赞成票,我将对此进行进一步的更新。最初,McAfee 的更新似乎确实解决了我们的问题,即我们不再定期看到 NP 内存出现大幅峰值。我还注意到,自更新以来,McAfee 似乎不再默认将日志写入事件查看器,当它正在主动扫描时,它会隐藏起来。

但我们仍看到 NP 内存使用量逐渐增加。现在我们每两周左右就需要重启一次服务器。情况非常糟糕,我们最近购买了一台新服务器,希望更新后的硬件和软件能解决这个问题我们的全新服务器仅安装了 Windows Server 2008、SQL Server 2008 R2 和 McAfee仍然显示 NP 内存泄漏。只有在我完全删除 McAfee 后,泄漏才停止,并且即使在我们设置好服务器并准备好切换到它之后,泄漏仍然保持不变。

我后来读到,我不知道这是否属实,问题不在于 McAfee,而在于 McAfee 使用的某些 Windows 例程,这些例程导致 NP 内存泄漏。显然,网络活动是泄漏的原因,即更多的网络活动 => 更大的泄漏。这似乎与我们的经验一致,因为我们的服务器变得越来越繁忙,泄漏也变得越来越严重。

相关内容