2010-06-11 38 views
6

如果這是更多的serverfault與stackoverflow,請諒解。它似乎在邊界上。如何超過ASP.NET緩存應用程序中IIS7的60%內存限制

我們有一個應用程序可以緩存使用ASP.NET緩存的電子商務應用程序的大量產品數據。這是一個包含65K元素的字典對象,我們的計算將對象的大小設置爲〜10GB。
問題:

  1. 的內存中的對象消耗的量似乎是遠遠超過我們的10GB的計算。

  2. 最大的問題:我們似乎無法使用服務器中超過60%的32GB。

我們試過到目前爲止:

在machine.config中/ System.Web程序(SF不允許的標籤,原諒的格式):

processModel autoConfig="true" memoryLimit="80" 

在web.config/system.web/caching/cache(sf不允許標籤,請原諒格式):

privateBytesLimit = "20000000000" (and 0, the default of course) 
percentagePhysicalMemoryUsedLimit = "90" 

環境: 的Windows 2008 R2 x64的 32GB RAM IIS7

似乎沒有什麼可以讓我們超過60%的價值。 查看taskman的截圖。

http://www.freeimagehosting.net/image.php?7a42144e03.jpg

+0

有根據的猜測:服務器正在重新調整其內存以適應增加的工作負載,使用更多的交換文件進行補償或更快地收集內存。類似的東西。 Taskman中的Performance選項卡看起來像什麼樣,當你加載負載?交換文件的大小是否增加? – 2010-06-11 03:31:12

+0

@Robert:Swap保持非常平坦(這是合理的,因爲它是一個內存緩存)。值得檢查。 @all: 我想知道單個對象的純粹尺寸是否是問題。 GC是否需要一定量的「鬆弛空間」來移動物體並且這個_one_對象超出了這個範圍? – evilknot 2010-06-11 03:52:30

+0

你是否交換對象進出字典?如果是的話,那可能會給GC帶來壓力,因爲每次交換都會釋放一個必須在某個點處理的對象。 GC可能不會等待您在執行收集之前耗盡內存。一些內存分析可能是按順序的。 – 2010-06-11 04:28:28

回答

1

你有使用不同的緩存策略考慮?內置的緩存功能並不豐富,你會努力讓它做更多的事情(除非一些IIS大師有一些聰明的工作)。

我們花了很多時間在這件事上,並放棄了。實際上,我們使用更苗條的對象來存儲緩存,並根據需要獲取更豐富的對象。

當我們需要考慮這個問題時,我們調查了Memcached和Velocity,但是從尚未部署的時候退出。儘管如此,它們的功能更豐富。

另外你如何通過代碼存儲在緩存中的項目?你是在申請開始還是在第一次申請之後把它們放在那裏?我問的原因是你的緩存鍵是否有效,實際上你反覆填充緩存而不檢索任何東西(這可能只是一種對象類型的情況)。例如,我們通過將時間附加到日期特定的緩存鍵來設法做到這一點。

+0

我們正在探索其他緩存。 我們只是在應用程序啓動時填充緩存一次,並且不會更改。除了nCache之外,我們一直在關注上述內容。謝謝! – evilknot 2010-06-11 18:50:08

+1

+1,asp.net緩存在這裏確實是錯誤的 - 你可能想要別的東西,並且不用處理。 – 2012-02-14 03:50:44

2

有點晚了,但我有幾乎相同的問題。 processModel上memoryLimit設置的問題在於它似乎沒有效果,儘管被記錄爲這樣。

percentagePhysicalMemoryUsedLimit類似看起來應該做些什麼,但沒有效果。

privateBytesLimit="20000000000"確實雖然工作。我去調試了這個進程並找到了CacheMemorySizePressure對象,並且它成功地獲取了該值並將其設置爲_memoryLimit。我會仔細檢查一下。

另一種方法是在IIS應用程序池上設置專用內存使用率回收閾值。這也應該拿起並且覆蓋默認的60%限制。

第三種方法是使用新的MemoryCache類並在其上設置PhysicalMemoryLimit