我们最近在我们的实时服务器上遇到了一个问题,导致我们的 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
Run Code Online (Sandbox Code Playgroud)
如果我们使用 poolmon.exe /g,它会将映射驱动程序显示为 [< 未知 > 事件对象]。
这几乎没有任何帮助。我的团队花了大量时间研究这个问题,但一直没能找到一个过程来将这个问题缩小到特定的应用程序或服务。我觉得大多数人似乎通过杀死机器上的进程来解决问题,直到他们看到非分页内存重置。这不是您在生产机器上工作时想要看到的。
如果我打开任务管理器并查看进程列表。我看到 MailService.exe 的 NP Pool 值为 105K,这比列出的第二个进程的值高 36K。由于过去我们的邮件服务器出现了一些问题(可能与此问题有关,也可能无关),我的直觉是这是导致问题的原因。
但是,在我们开始重新启动服务之前,我希望有更多的确定性,而不仅仅是“直觉”。
我也试过使用 poolmon.exe /c 但这总是返回错误:
unable to load msvcr70.dll/msvcp70.dll
Run Code Online (Sandbox Code Playgroud)
它不会创建 localtag.txt。我的同事不得不从互联网上下载 pooltag.txt,因为我们无法弄清楚它的位置。我们没有安装 win 调试器或 win DDK(我可以看到)。也许上述错误是因为我们没有安装其中任何一个 - 但我不知道。
最后我试过:
C:\windows\system32\driver\findstr /m /l Even *.sys
Run Code Online (Sandbox Code Playgroud)
这返回了相当大的 .sys 文件列表,再次对手头的问题没有任何帮助。
所以我的问题是:有没有其他方法可以缩小这种内存泄漏的原因?
更新:
如下所示,我一直在记录最后一天左右的池非分页字节数,以查看是否有任何进程呈上升趋势。在大多数情况下,所有进程的使用似乎都是相当静态的。其中两个看起来略有上升。在接下来的几天里,我将继续关注这一点。
我之前也忘了提到,似乎没有一个进程使用过多的句柄。
更新 2:
在过去的几周里,我一直在监视这一点。在此期间,各个进程的非分页字节池和总非分页字节池都保持相对稳定。在此期间,Windows …