2009-06-04 66 views
10

我知道這個問題的答案可能取決於註冊表設置和Windows的版本,也可能取決於內存不足時的RAM數量。爲了這個問題,假定服務器有足夠的RAM(3+ GiB)。正在使用的Windows句柄有多少「太多」?

如果應用程序(本例中爲第三方應用程序)以幾百小時的時間泄漏句柄,那麼在其他應用程序遇到麻煩之前該應用程序可以泄漏多少個總處理程序?例如,「麻煩」是指無法啓動線程,無法打開文件等等。

我已經看到一些服務器(輕微加載)使用幾萬個句柄的進程(通常是數據庫進程)運行得很好,所以舊的10000句柄限制在這裏顯然不是問題。 (這是一個每個進程限制,無論如何,所以不會影響到我的應用程序,它是好點之下。)

有人能回答任何問題或一些資源對多總如何處理解釋點我Windows服務器將允許在有效用完(處理或其他系統資源)之前?

+1

這似乎更像是一個ServerFault類型的問題也許。 – 2009-06-04 15:52:51

+1

@Matthew Vines:我考慮過這個問題,但是因爲我遇到了一個我維護的程序,所以決定即使第三方應用程序泄露了句柄,它也屬於程序員網站。如果我是管理員試圖弄清楚這一點,SF會更合適。 – Eddie 2009-06-04 16:02:31

回答

15

Raymond Chen's post on this topic。窗口管理器強制實施每個進程10K的限制,並且整個系統的總限制爲32K。因此,如果它「僅」泄漏每小時100把手,那麼在開始行爲不當之前,你有幾天的正常運行時間。

請注意,並非所有手柄都相同。窗口句柄不是數據庫句柄,例如,可能遵循不同的規則。所以這個限制可能不適用,取決於程序泄漏的程度。 Also read this blog post.

+1

在這篇文章中(http://blogs.technet.com/b/markrussinovich/archive/) 2009/09/29/3283844.aspx),它聲稱每個進程最多可以處理1600萬個句柄。我也注意到,在Windows XP中,我的兩個進程超過了10K的限制。我很困惑。 – jsirr13 2015-10-16 18:49:16

2

this,10000

+0

這些只是窗口對象的句柄,並不影響其他類型的句柄(文件,事件,互斥等) – 2014-04-21 19:30:30

5

desktop heap,這是一個內存池,其中真實的「東西」句柄代表生命。 有時候並不是你已經分配了多少個句柄,而是那個句柄下的每個對象有多少內存正在使用。您可以調試堆this way。這是一個pain安裝。

3

(這是從我的答案另一個循環)由於這些值可以與新的Windows版本的改變,你可以使用Sysinternals的工具TestLimit/TestLimit64得到一個粗略的估計。 x64版本可能會運行一段時間,特別是對於內存測試(它可能使用硬盤(交換文件)來獲得更多的虛擬內存)。

http://live.sysinternals.com/WindowsInternals/http://download.sysinternals.com/files/TestLimit.zip

命令行選項獲取工具:

-p check process limit 
-t check thread limit 
-h check handle limit 
-u check user handle limit