2015-10-14 23 views
2

我正在努力調試一個服務器進程在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提供的兩個處理,也許看看它。 –

回答

3

在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,這是我的問題。我會進一步研究。 –

相關問題