2016-12-14 175 views
26

我有一個asp.net-mvc網站,最近我在Web服務器上發現內存不足異常。我只有1個應用程序池,我們最近設置IIS在達到一定限制後進行回收。我去了一天,看到4 w3wp.exe進程運行(每個使用〜1.8GB內存)爲什麼IIS不清理池回收導致網站內存異常的舊工作進程(w3wp.exe)?

我假設在回收過程中,它不殺死老工人進程,最終我出去我的網站上的內存異常,因爲該盒只有8GB的內存。我可以增加內存,但我擔心爲什麼這些舊的進程沒有被清理。

是否有任何建議,找出爲什麼這個回收過程不殺死舊的w3wp.exe進程並讓它們運行?任何有關解決根本原因或解決方法的建議都可以避免這種風險。

+0

您是否有長時間運行的進程在運行? - 「默認情況下,IIS將使用重疊回收方法,該方法會在新進程處理新請求時保持舊進程,直到當前請求完成處理(或超時設置)爲止,從而確保服務的連續性,以便通常不會注意回收。「 –

+0

我確實有一些長期運行的流程,但工作流程在回收後一個小時左右就會停滯不前。 。我的長進程<1分鐘 – leora

+0

您可以使用IIS管理UI(工作進程實用程序)檢查給定站點/應用程序池的當前(未決)請求。這裏是一個示例鏈接:http://stackoverflow.com/questions/15621509/how-do-i-see-currently-executing-web-request-on-iis-8 –

回答

3

我有類似的問題,當我運行像FFMpeg.exe或一些PDF轉換與WPF圖形的東西,IIS進程將不會關閉,並會發出內存找不到錯誤。問題不在於IIS,而是在進程中發生一些死鎖,即使在崩潰之後也會阻塞。

解決方法是,將您的網站分爲兩個單獨的網站,一個應該只對通常沒有崩潰的數據庫執行事務處理。視頻/照片轉換,PDF轉換或任何其他可能導致崩潰的邏輯的邏輯都應該移至其他Web服務。並在內部使用來自您的網站的HTTP調用來通過Web服務處理它們。

現在,在這種情況下,仍然沒有辦法避開Web服務進程崩潰,所以我決定每100個請求就回收一次應用程序池worker(我在看了幾個請求之後選擇了這個數字,只有在達到200個請求後才超過1GB),並通過每個池創建4個進程將應用程序池轉換爲Web Garden。

此設置的優點是,您可以將Web服務進程輕鬆移動到其他計算機上,您可以增加/減少每個池的進程數。而您的主要網站只是在處理事務處理過程中變得高度響應,因爲它不受Web服務的流程回收的影響。

2

您應該追究的主要嫌疑人是實施IDisposable的職業,以及任何不使用Dispose()的職位。我有一個類似的問題,我已發佈回覆this question

最可能的原因是您沒有在數據庫連接上調用.Dispose()。人們往往會對此感到困惑,因爲.NET的內置連接池使其聽起來像,您不應該處理連接。但是,在請求結束時(或者完成使用連接時)調用.Dispose()正是您應該採取的措施來防止資源泄漏。連接池期望發生這種情況。

我不認爲4 w3wp.exe進程是一個值得關注的問題 - IIS產生多個進程是正常的。但很明顯,您的應用程序有資源泄漏需要解決。正如我上面提到的,從IDisposable開始。如果仍然存在問題,請查看緩存中的項目,並嘗試確定是否存在可以使用的更有效的緩存策略。如果一切都失敗,請對應用程序進行配置以查看是否可以找到資源泄漏的來源。很可能你的應用程序應該在某處執行IDisposable

2

由於從您的帖子可以明顯看出,在IIS達到一定限制後回收IIS以回收利用正在創建新的應用程序池。

可能有多種原因導致較舊的未終止。

一個可能是內存泄漏,不處置未管理的資源,你可以找這個。

要找出另一個原因,在IIS中啓用「進程孤立」。 要找出罪魁禍首,你可以使用「Process Explorer」。

您還可以選擇設置可執行文件,這將在Process處於孤立/放棄狀態時執行。

即時解決方案也可能是在某個CPU限制之後將操作設置爲KillW3p。

<applicationPools> 
    <add name="DefaultAppPool"> 
    <cpu limit="80000" action="KillW3wp" resetInterval="00:02:00" /> 
    </add> 
</applicationPools> 
相關問題