w3wp/asp.net 高記憶體使用 - 這有問題嗎?
我們有一個安裝在多個環境中的 asp.net (.net 4.0) web 應用程序。在大多數環境中,記憶體使用量在 1GB 左右。但是,我們有一個環境,記憶體使用量達到 5.5GB。這是在具有 4 個核心和 8GB 記憶體的 Server 2008 機器上作為 VMWare esx 客戶端執行的。
我設置了性能計數器,結果如下:
Memory Committed Bytes 10 145 739 948,0000 Pages Output/sec 0,0000 Paging File _Total % Usage 28,998 Process _Total w3wp Working Set 7 480 003 280 5 604 421 056
我還對 w3wp 程序進行了記憶體轉儲(當它是 +/-2GB 時,因為更大的轉儲失敗了)。在轉儲上執行 DebugDiag 並沒有讓我變得更聰明。.net 本身似乎只佔用了 800MB,而大部分記憶體都被“其他東西”佔用了。
.NET GC Heap Information GC Heap Size 826,09 MBytes Total Commit Size 1217 MB Total Reserved Size 16190 MB Heap Analysis Summary Number of heaps 29 Heaps Total reserved memory 1,89 GBytes Total committed memory 1,79 GBytes ... (largest of the Heaps) Reserved memory 1,69 GBytes Committed memory 1,67 GBytes(99,14% of reserved) Uncommitted memory 14,86 MBytes(0,86% of reserved) Number of heap segments 113 segments Number of uncommitted ranges 113 range(s) Size of largest uncommitted range 0 Bytes
問題是我不確定這種高記憶體使用是一個問題。所以我正在尋找的是如何處理這個問題的一些指導:
- 有人告訴我這就是 IIS7 的工作原理,我不應該擔心記憶體。
- 或者有人指出我如何進一步分析這個轉儲(尤其是我如何看到 1.6GB 堆中的內容。
- 或者向我解釋為什麼 .net 使用的內容和 W3WP 使用的內容之間存在如此大的差異。
如您所見,所有堆中的總字節數為 1.12GB。當時,W3WP 使用的是 6.4GB。為什麼這兩個數字相差這麼大?什麼會佔用這個空間?這是我看到的 LOH 的碎片嗎?
對於那些最終遇到類似情況的人:最終是 .net 框架的 Active Directory 庫中的非託管程式碼未正確處理。這就是非託管堆如此之大的原因。
我是如何找出罪魁禍首的?我最後只是查看隨機記憶體地址以找出內容是什麼。而且由於我發現了很多與 Active Directory 相關的數據,我知道這是在洩漏數據。
打了幾個
Dispose()
電話,問題就解決了。
這實際上更像是一個開發人員的問題,與 IIS 無關。
您應該做的第一件事是確定記憶體在哪個代堆中(0、1、2 或 3(大對象堆))
Process Explorer 提供了一種顯示此資訊的簡單方法。
在大多數情況下,.NET GC 是自我管理的。有一些 .config 參數可以對此進行調整,但這確實是開發人員應該提供指導的領域。
如果要檢查堆,WinDbg 可能是首選工具。
http://blogs.microsoft.co.il/sasha/2010/08/24/psscor2-object-inspection-commands-part-2/
http://blogs.microsoft.co.il/sasha/2010/08/26/psscor2-gc-heap-analysis-commands/