ASP.NET 記憶體修剪是否知道應用程序池記憶體限制?
我在 Win2003 32 位上執行一個 ASP.NET 應用程序,它往往會分配大量記憶體。為了避免在 W3P 程序超過 1 GB 時開始出現 OutOfMemoryExceptions,我為此應用程序池設置了 850 MB 的最大虛擬記憶體限制,因此應用程序將重新啟動而不是拋出異常。
雖然沒有拋出異常,但這些重啟仍然會導致暫時的性能下降(記憶體命中率低、aspx 編譯等),所以我想盡量減少重啟的次數。觀察性能計數器,我可以看到 ASP.NET 記憶體按設計工作(項目計數和記憶體命中率在啟動後增加,而某些項目可能由於到期日期而被刪除),但記憶體修整除外。
例如。我希望記憶體修剪會在例如 750 MB 正在使用中並且其中一半是記憶體時啟動。但它永遠不會發生,在負載下它會繼續分配越來越多的記憶體,而不是丟棄低優先級記憶體項,直到達到記憶體限制。
有人知道什麼會真正觸發記憶體修剪嗎?可用物理記憶體?是否有任何其他設置可用於優化此方案?
(是的,我知道,32 位是如此 2004 和 x64 這個問題會消失,甚至可能有相同數量的記憶體,但是對於這個應用程序,我在這台伺服器上又被困了幾個月,必須保持它跑步…)
我終於找到了問題。ASP.NET 記憶體有一個可選的 web.config 配置部分: https ://msdn.microsoft.com/en-us/library/ms164606(v=vs.100).aspx
對於 RAM 超過 2 GB 的 32 位機器,預設配置絕對是無稽之談:如果可用*的物理 RAM 少於 10%,它將開始丟棄記憶體中的項目。*例如,安裝了 4 GB 的 RAM 並且每個程序有 2 GB 的限制,這永遠不會發生。因此,記憶體大小(因此堆大小,主要是第 2 代堆)不斷增加,直到您遇到 OutOfMemoryExceptions,或者您達到應用程序池限制。
現在我將它添加到我的 web.config 中:
<configuration> <system.web> <caching> <cache privateBytesLimit="400000000" privateBytesPollTime="00:01:00" /> </caching> </system.web> </configuration>
此外,我為應用程序池設置了以下限制:
- 1400 MB 虛擬記憶體限制
- 800 MB 已用記憶體限制(私有字節)
有關這些值的背景資訊,請參閱這篇精彩的文章:http: //msdn.microsoft.com/en-us/library/ms972959#monitor_perf_topic10
現在,如果我以一種在短時間內將大量對象添加到記憶體中的方式對我的應用程序進行負載測試,我可以看到 ASP.NET 記憶體修剪性能計數器上升,並且記憶體使用量始終保持在我的重啟限制之下。