我如何确定什么应用程序泄漏非分页内存?

我们最近在我们的实时服务器上遇到了一个问题,导致我们的Web App停止响应。 所有我们得到的是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,它将Mapped Driver显示为[<未知>事件对象]。

这几乎没有任何帮助。 我的团队花了相当多的时间研究这个问题,一直没有find一个过程来缩小到一个特定的应用程序或服务。 我感觉大多数人似乎通过杀死机器上的进程来解决问题,直到他们看到未分页的内存复位。 这不是你在生产机器上工作时所看到的。

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

但是,在我们开始重新启动服务之前,我想比“直觉”更确定一些。

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

 unable to load msvcr70.dll/msvcp70.dll 

它不会创buildlocaltag.txt。 我的同事不得不从网上下载pooltag.txt,因为我们无法弄清楚它在哪里。 我们没有胜利debugging器或赢得DDK安装(我可以看到)。 也许上面的错误给出了,因为我们没有安装任何一个 – 但我不知道。

最后我试了一下:

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

这返回了一个相当大的.sys文件列表,再一次没有帮助手头的问题。

所以我的问题是: 有没有其他办法来缩小这个内存泄漏的原因?

更新:

如下所示,我一直在logging最近一天左右的Pool Nonpaged Bytes,看看是否有进程趋势。 在大多数情况下,所有的stream程在使用过程中都显得相当静态。 他们中的两个看起来已经略微上了一些。 我将在接下来的几天里继续关注这个问题。

我也忘了提前提到,没有一个过程似乎是使用过多的句柄。

更新2:

过去几个星期我一直在监视这个。 单个进程的非分页字节池和非分页字节池总数在这段时间内保持相对稳定。 在此期间,Windows被更新,服务器重新启动,所以我想知道是否已经解决了这个问题。 在我之前,我绝对没有看到非分页字节池的持续增长。

我现在已经监测了大约6-7周,最终可以给出明确的答案。

首先,单个进程的非分页字节并没有真正地告诉我任何有用的东西,因为它们在使用上都显得相当静态。 有尖峰,但使用后总是返回到基线。

非分页字节内存总计是一段时间静态,但随后开始逐渐增加,然后尖峰。 大约一半的记忆被释放后,再一次保持静止(在较高水平)一段时间,直到模式重复。 看着图表,我注意到,这些尖峰似乎是相当规则的间隔,事实certificate,他们正在发生2周,总是在星期天。

所以接下来的问题是:星期天双周运行什么? 我在事件查看器中查看过,每次McAfee运行时都会出现峰值。 我也认为,经常login服务器来监视这个问题,我们无意中将问题变得更糟,因为迈克菲有一个实时扫描器,我相信这导致了我们所看到的较小的增长。

我认为扫描作为计划任务也解释了为什么我们看到了附加到PoolMon中Event对象标记的NP Memory增长,而不是McAfee特定标记。 这是真正导致我们走下花园的主要原因。

现在我们终于知道是什么造成了泄漏,我们可以做些什么。 不可思议的是,花了这么长的时间来追踪它。

更新 :就像最后一个注释。 McAfee的周末更新,这完全解决了我们的非分页内存问题。

更新2 :由于我刚刚得到了这个投票,我会添加进一步的更新。 最初,迈克菲的更新似乎解决了我们的问题,即我们不再定期看到NP内存中的巨大峰值。 我也注意到,自更新以来,McAfee似乎不再将日志写入事件查看器,现在默认情况下,它会在主动扫描时隐藏。

但是我们仍然看到NP内存使用的逐渐增加。 到了现在我们需要每两周重启一次服务器。 最近我们收购了一台新的服务器,希望更新后的硬件和软件能够解决这个问题, 但是我们全新的服务器只安装了Windows Server 2008,SQL Server 2008 R2和McAfee, 仍然显示NP内存泄漏。 直到我彻底删除了McAfee之后,泄漏才停止,即使在我们使用我们的所有软件准备切换到服务器之后,仍然保持静态。

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