我正在努力调试我们的服务器进程在60-90天内消耗大量句柄的问题。服务器父进程生成并循环许多子进程,每个子进程大约每小时回收一次。父母的流程处理计数将增加到4万以上,超过两个月,但我不确定句柄的引用是什么。
使用ProcessExplorer,我可以看到句柄计数和列出的句柄数量(下图是一个例子)。但是,列出的句柄数量不接近上部窗格中显示的40k数字。我在句柄窗口中有大约100个条目,并查看它们的属性,我可以在这个窗口中占到总句柄的大约3k,与总共40k相差不远。
我已让父母每隔几分钟给孩子骑车,试着看看是否与骑车的孩子有关,但监测一小时似乎没有结果在父进程句柄数上升任何。在此期间它会上下波动,但不会呈上升趋势。不可否认,一个小时与两个月相差甚远,但这是一个开始。
我非常欣赏如何进一步解决这个问题。不幸的是,这超出了我的一般知识,所以我有点迷失。在识别可能包含此句柄计数的内容时,将非常感谢任何帮助。
更新:根据以下josh poley
的建议,我使用了来自Sysinternals的handle.exe
来检查该过程。使用-a
标志,我只得到5个结果。接下来,我尝试了-s
标志,该标志列出了所有进程中的句柄计数。我运行了一次,然后重新启动受影响的服务器并再次运行它。突变手柄类别急剧下降,这让我觉得我需要关注那里。将研究
答案 0 :(得分:3)
Process Explorer中的句柄视图不会显示所有可能的句柄类型(只是通常需要的句柄类型,它可以提供有用的详细信息)。
您应该使用handle.exe
(也来自sysinternals集)和-a
选项以及您的进程ID,然后解析输出。例如:
handle.exe -a -p 26916 >handle.out
只需在我的框中选择一个随机进程,handle.exe就会显示795个EtwRegistration句柄,这些句柄不会显示在Process Explorer GUI中。