rea*_*idt 5 asp.net application-pools cache 32-bit
我在 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>
Run Code Online (Sandbox Code Playgroud)
此外,我为应用程序池设置了以下限制:
有关这些值的背景,请参阅这篇很棒的文章:http : //msdn.microsoft.com/en-us/library/ms972959#monitor_perf_topic10
现在,如果我以在短时间内将大量对象添加到缓存的方式对我的应用程序进行负载测试,我可以看到 ASP.NET 缓存修剪性能计数器上升,并且内存使用量始终保持在我的重新启动限制之下。