ASP.NETcaching修剪意识到应用程序池内存限制?

我正在Win2003 32位上运行一个ASP.NET应用程序,它倾向于分配大量的内存。 为了避免在W3P进程超过1 GB时开始出现OutOfMemoryExceptions,我为此应用程序池设置了最大850 MB的虚拟内存限制,因此应用程序将重新启动而不是抛出exception。

虽然不抛出exception,但这些重新启动仍然导致时间性能退化(低caching命中率,aspx编译等),所以我想尽量减less重新启动次数。 看到性能计数器,我可以看到,ASP.NETcaching按devise工作(开始之后项目数和caching命中率增加,而在某些项目移除后,可能由于过期date而增加),除了caching修剪。

例如, 我希望caching修剪在例如750 MB正在使用,并有一半是caching踢。 但是它永远不会发生,在负载下它将继续分配越来越多的内存,而不是像低级的caching项一样,直到达到内存限制。

有谁知道什么会实际触发caching修剪? 可用的物理内存? 有没有其他设置可以优化这种情况?

(是的,我知道,32位是如此2004年和64位这个问题将消失,可能即使有相同数量的内存,但对于这个应用程序,我被困在这台服务器再过几个月,必须保持它运行…)

我终于find了问题。 有一个可选的ASP.NETcachingweb.configconfiguration部分: https : //msdn.microsoft.com/en-us/library/ms164606(v=vs.100).aspx

对于RAM大于2 GB的32位机器,默认configuration是绝对没有意义的:如果less于10%的物理RAM可用,它将开始抛出caching项目。 例如安装了4 GB的内存和每个进程2 GB的限制,这绝不会发生。 因此,caching大小(因此堆大小,主要是第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/zh-cn/library/ms972959#monitor_perf_topic10

现在,如果我加载testing我的应用程序的方式,很多对象将在短时间内被添加到caching中,我可以看到ASP.NETcaching修剪性能计数器不断上升,并且内存使用量始终停留在我的重新启动限制。