2011-07-28 43 views
0

我遇到了我們的ASP.NET應用程序的問題,偶爾夜間回收的情況下w3wp掛起。w3wp偶爾掛在每晚的回收

這是發生了什麼:

回收被觸發。顯然這會在所有正在運行的線程上強制ThreadAbortException。但是,它似乎沒有觸發新的w3wp,或者它是實際引發異常的新w3wp(尚未能夠重現它)。

在我的日誌我得到了很多ThreadAbortException的,線程數只上升,一直運行下去,這意味着任何新的請求產生一個新的線程,永遠不會結束。如果這將是舊的w3wp,則任何新的請求都將被路由到新啓動的w3wp。

關閉超時和快速失敗保護似乎也不會觸發,只有在手動回收之前,saite纔可用。大多數情況下,它也會佔用大量CPU,使服務器幾乎無法使用。

我們正在使用Monorail MVC,它可能與它沒有任何關係,但是我們確實使用它們的RescueController系統。如果我們無意中在我們的錯誤處理中捕獲了ThreadAbortException,是否可能導致無限循環,導致w3wp掛起太嚴重以致於IIS無法從其中恢復?

+0

可能要確保記錄所有的回收事件。從powershell:'set-webconfigurationproperty /system.applicationHost/applicationPools/applicationPoolDefaults/recycling -name:logEventOnRecycle -value:'Time,Requests,Schedule,Memory,IsapiUnhealthy,OnDemand,ConfigChange,PrivateMemory'' –

回答

1

由於資源限制,IIS可能由於沒有足夠的可用內存而無法成功啓動新的工作進程。

嘗試在IIS中調整您的私有內存限制,減少最大工作進程數(也稱爲Web Garden)(很少將其設置爲大於1,如果設置爲高於可能需要解決的潛在問題)物理內存在您的服務器上可用,適當地調用Marshal.ReleaseComObject,否則就會排除阻止釋放內存的內容。您甚至可以考慮將垃圾收集模式從服務器更改爲Workstation(請參閱http://msdn.microsoft.com/en-us/library/ms229357.aspx)。

+0

非常感謝您的輸入。我們沒有使用網絡花園,所以這不應該是一個問題。有限的內存分配聽起來似乎合理,我會研究它。關於服務器垃圾收集模式,並不知道那裏有兩種不同的模式。這是一款雙核四核機器(總共8個),但它運行多個站點。這兩種模式有什麼優點和缺點?這聽起來像併發垃圾收集是一件好事? – jishi

+0

在跳轉到切換垃圾收集模式之前,請確保並配置您的應用程序以更好地表徵您遇到的問題。運行性能監視器(「%windir%\ system32 \ perfmon.msc/s」),閱讀本文以幫助瞭解要監視的性能計數器。諸如CLRProfiler(http://msdn.microsoft.com/en-us/library/ff650691.aspx)等工具可能會有所幫助。如果證據繼續指向內存和垃圾收集,請參閱此操作系統線程:http:// stackoverflow。com/questions/4931309/how-to-make-net-garbage-collection-less-frequently –

+0

我的主要問題是隻有在生產環境中我注意到了這種行爲,而且我無法訪問這些服務器。看看我們對服務器的內存圖,雖然他們以5分鐘的時間間隔進行監控,但在回收時間內我沒有看到可用內存的直接下降。然而,服務器通常會下降大約30分鐘,直到手動重新啓動完成,所以在那段時間內,它應該是非常低的,我認爲,根據圖表,我仍然有大約3GB可用(16GB) – jishi

0

事實證明,我們有一個Exception的遞歸try catch循環,它捕獲ThreadAbortException,並因爲繼承而自行調用,所以它成爲一個無限遞歸。

我們有Exception的catch,因爲我們想要記錄和一些錯誤處理,並且除了ThreadAbortException在執行過程中將繼續拋出之外,其他方面都可能會很好。

+0

這不是。 – jishi

+0

那是什麼? –

+0

@JasonCoyne我認爲我們沒有達到底線。我們做了一些啓動優化以減輕我們看到的啓動負載,並最終轉換到Win2012,這可能會改善事情。 – jishi