createWindowEx
失敗的異常是由我的服務器引發的,它使用的是.net C#windowsforms中的overbyteICS
dll。createWindowEx失敗異常
我有一臺服務器,可以全天處理大量客戶端。但是,當總連接數(即連接和斷開連接數)達到10000時,會出現上述錯誤,並且服務器停止接受用戶連接並掛起機器。
createWindowEx
失敗的異常是由我的服務器引發的,它使用的是.net C#windowsforms中的overbyteICS
dll。createWindowEx失敗異常
我有一臺服務器,可以全天處理大量客戶端。但是,當總連接數(即連接和斷開連接數)達到10000時,會出現上述錯誤,並且服務器停止接受用戶連接並掛起機器。
我同意Roger,但讓我們先確認一下 - 發生此錯誤時,請從開始菜單中的MicrosoftVisualStudio \ Tools運行SPY++
並查看窗口樹。展開分支並查找某些窗口的重複項。當然會有很多,但你對數百和數千份感興趣。如果你碰到這種情況,那麼這就是羅傑所說......並且除了定期重新啓動連接服務器進程(或者整臺機器以防萬一)以確保它不會掛起之外,幾乎沒有解決方案(當然,服務器重新啓動將刺激用戶的幾乎一樣多..),或固定/修補/重新實現連接服務器的過程更加資源友好..
注意,在打開每一個連接一個隱藏的窗口是一個非常浪費的做法,它仍然保持不是掛機。它只是應該放棄它無法處理的連接。在這裏,它似乎沒有任何限制,這是一個錯誤。
編輯:在NT之前(即win9x),限制是硬編碼的。在NT上一流的系統,你可以試着捏捏池:
但儘管如此,我認爲,作爲最後的restort,當連接的數量再次上升的問題將返回。首先,嘗試ping服務器開發人員以永久修復該問題。
我可以以某種方式增加到10000到20000? – Nikki
如果你確實遇到_that_問題,那麼很難。IIRC,Windows的最大數量是硬編碼的限制,但正如我所說的,除非你使用的是非常舊的Windows版本,它已經很高了。您可以嘗試運行SPY ++並檢查其他**程序生成的窗口,然後關閉它們以釋放更多的句柄,但是,您可能很難手動查找並關閉接下來的10000個窗口:)您可以配置OS在啓動時運行更少的服務和程序來減少處理計數。 – quetzalcoatl
注意:更正:它是在舊系統中硬編碼的,現在看來它可以配置一點。看到我的編輯回答 – quetzalcoatl
您診斷得很好。是的,一個CreateWindowEx()失敗和10,000個屬於一起。 10,000是進程的默認user32對象配額。換句話說,單個進程不允許創建超過10,000個窗口。這是針對泄露窗口句柄的應用程序的對策,這是一個非常常見的錯誤。可以在會話中創建的窗口總數是有限的資源,如果一個進程佔用它們全部會導致完全失敗,則無法再關閉Windows。
顯然這不是你的情況的泄漏。您可以通過更改註冊表設置HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Windows \ USERProcessHandleQuota來找到臨時解救。重新啓動以使其生效。
如果機器不運行需要大量窗口的進程,則從10,000增加到最大值18,000應該可以。你可以用Taskmgr.exe,Processes選項卡看到的東西。選擇視圖+選擇列並勾選USER對象。同時勾選GDI對象和句柄,以及其他具有配額的資源。
長期來看,這種行爲不能很好地擴展。您需要找到爲每個Web請求創建窗口句柄並修復它的代碼。
聽起來像您的圖書館每個連接都使用一個隱藏的窗口。 Windows相對比較昂貴,所以當你創建數千個窗口時,你可能會認爲'CreateWindowEx'開始失敗。 –
那麼有沒有解決方案? – Nikki
文件對庫的錯誤或使用不同的庫... –