Asp.net

w3wp 應用程序池 IIS 7 的高記憶體使用率

  • March 12, 2012

我有一個網站應用程序在 IIS 7.0 上它自己的應用程序池中執行。該應用程序是一個 ASP.NET MVC 3 網站。

我注意到這個應用程序對應的 w3wp IIS worker 服務的記憶體使用率很高(800 MB,有一些波動)。

我正在嘗試診斷問題並嘗試了以下方法:

我在 IIS 級別禁用了網站的輸出頁面記憶體,然後回收了應用程序池。這會導致 w3wp 程序重新啟動。然後,此過程的記憶體使用量慢慢上升到大約 800 MB,大約需要 30 秒。目前沒有正在處理的頁面請求。當我從 IIS 重新啟動網站時,程序的記憶體大小不會改變。

我嘗試從 VS 2010 執行應用程序的調試副本,記憶體使用沒有問題。

我的一些想法/問題是:

這個問題與網站程式碼有關嗎?- 鑑於在發送/處理任何頁面請求之前記憶體迅速增長,我認為這不是程式碼問題?

在 MVC 中建構的應用程序沒有處理寫入其中的記憶體。

該網站使用實時數據顯示,它定期使用 ajax 請求,並且通常長時間保持“打開”狀態。

為什麼在應用程序被回收並且沒有發送使用者請求後記憶體使用量會猛增?這是因為它正在將舊的記憶體資訊從磁碟載入到它的記憶體中嗎?

應用程序不會崩潰,我只關心記憶體使用情況,它不是一個大網站……

任何有助於解決這個問題的想法/幫助將不勝感激。

我剛剛查看了我的伺服器,我的池使用 900-1000 MB 虛擬大小的記憶體和 380 MB 工作集。我的網站多年來一直執行順利,沒有出現任何問題,而且我已經從各個方面檢查了這些網站。我的池從不回收,伺服器一直執行到下一次更新,並持續使用 40% 的穩定可用物理記憶體。

如果您的記憶體沒有持續增長,那麼此記憶體就是程式碼加上您在應用程序中設置為靜態、常量、字元串和可能的記憶體的數據。

您可以使用程序資源管理器查看工作和虛擬大小的記憶體。

您還可以考慮針對您的程式碼執行配置文件,以查看是否有任何“記憶體洩漏”或其他問題。從Google找到一個:https ://www.google.com/search?hl=en&q=asp.net+memory+profiler 。

如果您有能力使用調試器,最好的辦法是安裝Windows 調試工具並使用 WinDbg 和 SOS.dll 之類的工具來確定記憶體中的確切內容。

安裝工具後,您可以:

  1. 啟動執行提升的 Windbg.exe(以管理員身份)
  2. 使用“文件->附加到程序”並為您要查找的應用程序選擇 w3wp.exe。如果你有很多你可以使用任務管理器並添加命令行列來查看 PID 或使用 IIS 管理器->工作程序來找出它,然後在 WinDBG 中選擇該程序。
  3. 跑步:
  4. .loadby sos clr
  5. !dumpheap -stat

此時,您應該能夠看到按記憶體消耗最多的類型排序的所有類型,因此您可以從底部的類型開始。(我建議排除字元串和對象,因為它們通常是副作用而不是原因)。使用“!dumpheap -type type-here”查找實例並使用 !gcroot 找出它們為什麼在記憶體中,可能是由於靜態欄位、事件處理程序洩露、WCF 通道未釋放或類似這是常見的來源。

引用自:https://stackoverflow.com/questions/9666356