【问题标题】:Asp.net caching and w3p memory usageAsp.net 缓存和 w3p 内存使用
【发布时间】:2010-11-04 15:29:34
【问题描述】:

将图像存储在数据库中的 Web 应用程序。

在我们的第一个设置中,我们从在 asp.net 缓存中调整大小的数据库中存储(和提供)图像。这一切都很好,但是随着网络开始获得越来越多的点击,我们开始遇到奇怪的问题,而且奇怪,我的意思是奇怪 - 从没有任何细节的 w3p 崩溃到每天到处发生几次的随​​机 OutOfMemoryExceptions。

我怀疑asp.net缓存可能被我们这里滥用了,所以我重写了图像缓存到文件系统。我们的图像处理程序现在检查缓存目录中调整大小的图像,如果不存在这样的图像,则从数据库中获取它并将其保存在缓存目录中,并从那里提供它。

困扰我的是这个网站的 w3p 内存使用情况。之前,当我们使用 asp.net 缓存对象时,w3p 的典型内存使用量约为 600mb。现在,当处理程序从文件系统提供图像时,典型的内存使用量约为 750mb。不知何故,我预计它会下降(至少有一点),但绝对不会上升。这有什么解释吗?

其次,有没有办法检查 w3p 进程以查看有多少内存用于什么用途?想到的一件事是性能计数器,但还没有时间检查。

【问题讨论】:

  • 为什么不使用分析器来查看占用内存的内容?

标签: asp.net caching


【解决方案1】:

这只是我的猜测,但如果文件 I/O 被缓冲,那不会占用大量内存吗?可能比 ASP 缓存更重要,因为提供的每个文件都需要一个缓冲区,而不是从缓存中获取共享资源。

至于内存分析,有许多分析器程序可供您使用它们来分析正在发生的事情。

【讨论】:

  • 所以你是说从文件系统提供文件比在 asp.net 的缓存中缓存它使用更多的内存?我不知道是不是只有我,但这听起来是错误的/奇怪的。谁能证实这一点?
  • 我确实说过这是猜想——我只是在大声思考。
  • 我已经勾选了您提醒我分析器工具的答案。使用 .net 内存分析器,现在缓存中的页面(字符串)似乎比它充满图像时更多。谢谢。
【解决方案2】:

您确定已为这些项目禁用了 OutputCache 吗?看起来你仍然执行动态代码来确定是否在必要时创建调整大小的图像,所以仍然可能有一个活动的 OutputCache

【讨论】:

  • 请说明“禁用的OutputCache”是什么意思?图像通过 asp.net 处理程序 (ashx) 提供。
  • 我没怎么用过.ashx,也不知道能不能在上面加个OutputCache。使用分析器无疑是找到原因的最佳方法,尽管它可能需要一些时间。祝你好运!
  • 如果有人对此感到疑惑,我认为 ashx'es 上没有 OutputCache
【解决方案3】:

缓存中的许多图像导致它不断增长。当进程占用 60% 的可用内存时,asp.net 的默认行为是重新启动。

当一个进程将被回收并创建第二个但第一个长时间没有完成时,可以抛出 OutOfMemoryException。然后你有 2 个进程占用大量内存。如果应用程序很忙并且有很多请求,那么一次可能会超过 2 个进程。这会导致 OutOfMemoryException。

我重写了图像缓存以转到 文件系统。我们现在的图像处理程序 检查缓存目录中调整大小的图像, 如果不存在这样的图像,则获取它 来自数据库并将其保存在缓存中 dir,并从那里提供服务。

这是最好的解决方案。文件系统在操作系统级别缓存。

【讨论】:

  • 我也认为这是最好的解决方案,但是您如何解释 w3p 的内存使用量增加?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 2019-05-16
  • 1970-01-01
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
相关资源
最近更新 更多