禁用ASP.NET HttpHandler响应缓存

前端之家收集整理的这篇文章主要介绍了禁用ASP.NET HttpHandler响应缓存前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
背景

我正在比较在IIS 7下运行的NancyFx和ServiceStack.NET的性能(在Windows 7主机上进行测试)。两者都是疯狂的快速 – 本地测试每个框架过程超过10,000 req /秒,ServiceStack快20%。

我遇到的问题是,ASP.NET似乎正在缓存来自HttpHandler的每个唯一的URI请求的响应,很快导致巨大的内存压力(3 GB),并使垃圾收集器工作过多(约25% GC)。到目前为止,我一直无法禁用对象的缓存和构建,并且正在寻找有关如何禁用此行为的建议。

细节

请求循环基本如下:

for i = 1..100000:
    string uri = http://localhost/users/{i}
    Http.Get(uri)

响应是一个简单的JSON对象,格式为{UserID:n}。

我打开了WinDBG,对于每个请求都有:

> One System.Web.FileChangeEventHandler
> Two System.Web.Configuration.MapPathCacheInfos
>两个System.Web.CachedPathDatas
> Three System.Web.Caching.CacheDependencys
> Five System.Web.Caching.CacheEntrys

显然,这些缓存项目是引导我相信这是一个缓存膨胀的问题(我想要摆脱15万个不可用的对象!)。

到目前为止我已经尝试过

>在IIS的HTTP响应标头中,将“过期Web内容”设置为“立即”。
>在web.config中

<system.web>
 <caching>
    <outputCache enableOutputCache="false" enableFragmentCache="false"/>
  </caching>
</system.web>

>还有在web.config(和许多变体的策略,包括没有)。

<caching enabled="false" enableKernelCache="false">
  <profiles>
    <add policy="DontCache" kernelCachePolicy="DontCache" extension="*/>
  </profiles>
</caching>

>查看框架的源代码,看看是否有任何内置的功能将使用ASP.NET缓存。虽然有缓存助手,但它们对于框架本身是私有的,并不会出现利用ASP.NET缓存。

更新#1

通过反射器挖掘我发现将UrlMetadataSlidingExpiration的值设置为零消除了大量的内存使用量过多,牺牲了将吞吐量降低了50%(FileAuthorizationModule类缓存FileSecurityDescriptors,这些生成必须有点昂贵,当UrlMetadataSlidingExpiration不为零时)。

这是通过更新web.config并将以下内容放在

<hostingEnvironment urlMetadataSlidingExpiration="00:00:00"/>

如果可能,我将尝试完全禁用FileAuthorizationModule运行,看看是否有帮助。但是,ASP.NET仍然生成2 * N MapPathCacheInfo和CacheEntry对象,所以内存仍然被消耗,只是速度慢得多。

更新#2

另一半的问题是与这里所述相同的问题:Prevent many different MVC URLs from filling ASP.NET Cache.设置

< cache percentagePhysicalMemoryUsedLimit =“1”privateBytesPollTime =“00:00:01”/>
帮助,但即使这些非常激进的设置内存使用率快速上升到2.5GB(相比4GB)。理想情况下,这些对象永远不会被创建。否则,我可能会诉诸一个使用反射来清除缓存的恶意解决方案(所有这些条目都是“私有”,并且在公共Cache迭代时不被列举)。

解决方法

对于遇到同样问题的其他人迟到的回应:

这是一个已知的问题:
KB 2504047

This issue occurs because the unique requests that try to access the same resources are cached as MapPathCacheInfo objects for 10 minutes.

While the objects are cached for 10 minutes,the memory consumption of
the W3wp.exe process increases significantly.

您可以下载修补程序here

猜你在找的asp.Net相关文章