我如何识别此过程已打开的处理?

我如何识别此过程已打开的处理?

问题描述:

我正在努力调试一个服务器进程在60-90天内消耗大量句柄的问题。服务器父进程产生并循环许多孩子,每个孩子每小时回收一次。父母的进程句柄数将在两个月后增加到40k,但我不确定这些句柄的引用是什么。我如何识别此过程已打开的处理?

使用ProcessExplorer,我可以看到句柄数和一些句柄(下图是一个例子)。但是,列出的手柄数量并不接近上方窗格中显示的40k数字。我在手柄窗口中有大约100个条目,并查看它们的属性,我可以用这个窗口总计约3k的句柄,与总共40k的句柄相差甚远。

我已经设置父母循环它的孩子每隔几分钟尝试,看看它是否有与循环儿童有关,但监测一个小时似乎并没有导致父进程处理计数上升任何。在这段时间里它会上升和下降,但不会呈上升趋势。无可否认,一个小时与两个月相差甚远,但这是一个开始。

我真的很感谢一些方向,我可以如何解决这个问题。不幸的是,这是我的常识之外,所以我有点失落。在确定可能包含这个句柄计数的情况下,将非常感谢任何帮助。

enter image description here

更新:通过josh poley基于推荐下面,我使用Sysinternals公司的handle.exe检查过程。使用-a标志,我只有5个结果。接下来我尝试了-s标志,该标志列出了所有进程中的句柄计数。我运行了一次,然后重新启动受影响的服务器并再次运行它。突变处理类别大幅下降,这让我觉得我需要关注这个类别。将研究

enter image description here

+0

在黑暗中随机拍摄:在处理产卵孩子和漏手柄时,一个典型的问题是不关闭lpProcessInformation中CreateProcess提供的两个处理,也许看看它。 –

在Process Explorer的手柄视图不显示所有可能的句柄类型(即通常只需要一和它可以提供有用的信息)。

您应该使用handle.exe(也来自sysinternals集),将-a选项与您的进程ID结合使用,然后解析输出。例如:

handle.exe -a -p 26916 >handle.out 

刚采摘我的盒子一个随机过程,handle.exe显示795个EtwRegistration手柄,其不会在Process Explorer的界面显示出来。

+0

所以我看了一下handle.exe,并且使用了-a选项,我的进程只有5行输出。但是,使用-s选项,我得到了所有进程中所有句柄的计数。我重新启动了我的服务,并再次运行它,并且它看起来处理类型是Mutant,这是我的问题。我会进一步研究。 –