Teu*_*n D 6 .net memory asp.net asp.net-mvc
我们的网站使用ASP.NET MVC作为其中的一部分页面.这些URL的格式通常为http://oursite/detail.mvc/12345/pictures/在此URL中,12345是数据库中的ID.我们有几十万个对象,我们为其显示详细页面.最近我们注意到该网站的内存使用量有所增加,所以我调查了一下.我们对生产站点进行了内存转储,发现大量的内存使用量是由"dmachine/webroot/1/site/detail.mvc/12345/pictures /"和"H"形式的Cache中的字符串引起的. :\网站\ detail.mvc\12345 \图片\".
进一步研究和大量使用Reflector表明这些字符串以System.Web.CachedPathData对象的形式存储在ASP.NET Cache中.这是ConfigurationManager在从web.config文件中读取信息时创建的.它调用HttpContext.GetSection() - > HttpContext.GetConfigurationPathData() - > CachedPathData.GetVirtualPathData().最后,在CachedPathData.GetConfigPathData中,确定所请求路径的虚拟路径,并将其缓存在ASP.NET缓存中而不会过期.
现在麻烦的是我们有数百万个不同的URL,并且对于每个路径,配置系统在缓存中存储了许多字符串(configPath,虚拟路径,物理路径).随着时间的推移,这些信息消耗几百MB,几乎所有缓存中的数据.
我假设当内存稀缺时,这些条目将被删除,但在操作中,它们不信任增长和增长的进程.它似乎也非常低效.有没有办法告诉HttpContext不要为每个唯一的URL缓存此信息?或者我们可以先将请求路径映射到一个更简单的URL,然后用它来选择正确的web.config?
好吧,我想了一下(Teun 和我在同一家公司工作),据我所知,我们有两个选择:
没做什么。本文包含一位 ASP.NET 团队人员的评论,它展示了几种防止缓存不断增长的方法:http://forums.asp.net/p/985551/3297967.aspx#3297967,但是并没有解决为每个可能的路由写入缓存条目的问题,但保证缓存不会抛出一些内存不足异常。
使用解决方法解决问题,使用查询字符串参数而不是固定路由(/controller.mvc?action=X¶ms=Y 而不是controller.mvc/action/params)。这样只有controller.mvc被缓存。
毕竟,我不认为这真的是一个问题。
| 归档时间: |
|
| 查看次数: |
617 次 |
| 最近记录: |