【发布时间】:2015-10-14 16:18:26
【问题描述】:
我正在调试我们的一个服务器进程的问题,该进程在 60-90 天内消耗大量句柄。服务器父进程产生并循环许多子进程,每个子进程大约每小时回收一次。父进程句柄计数将在两个月内上升到 40k 加,但我不确定句柄到底引用了什么。
使用 ProcessExplorer,我可以看到句柄计数和列出的句柄数量(下图是一个示例)。但是,列出的句柄数量并不接近上窗格中显示的 40k 数量。我在句柄窗口中有大约 100 个条目,通过查看它们的属性,我可以使用这个窗口占总句柄的大约 3k,与总共 40k 相去甚远。
我已将父进程设置为每隔几分钟循环一次子进程,以尝试查看它是否与循环子进程有关,但监控一个小时似乎并没有导致父进程句柄计数上升.在此期间它会上下波动,但不会呈上升趋势。诚然,一个小时与两个月相去甚远,但这只是一个开始。
我非常感谢有关如何进一步解决此问题的一些指导。不幸的是,这超出了我的常识,所以我有点迷茫。在确定可能包含此句柄计数的内容时,我们将不胜感激。
更新:根据下面josh poley 的建议,我使用来自 Sysinternals 的handle.exe 来检查该过程。使用 -a 标志,我只得到 5 个结果。所以接下来我尝试了-s 标志,它列出了所有进程的句柄数。我运行了一次,然后重新启动了受影响的服务器并再次运行它。突变手柄类别急剧下降,这让我觉得我需要专注于那里。会研究
【问题讨论】:
-
暗中乱拍:在处理spawning children和泄露handle时,一个典型的问题是lpProcessInformation中CreateProcess提供的两个handle没有关闭,不妨看看。