Windows-Server-2008

w3wp/asp.net 高記憶體使用 - 這有問題嗎?

  • April 11, 2016

我們有一個安裝在多個環境中的 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 使用的內容之間存在如此大的差異。

編輯:這是我在 ProcExp 中看到的: 在此處輸入圖像描述

如您所見,所有堆中的總字節數為 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/

Process Explorer GC 堆資訊

引用自:https://serverfault.com/questions/714390