将图像存储在数据库中的Web应用程序。
在我们的第一个设置中,我们存储(和服务)来自在asp.net缓存中调整大小的数据库的图像。这一切都很好,但随着网络开始越来越多的点击,我们开始遇到奇怪的问题,而且奇怪的是,我的意思很奇怪 - 从没有任何细节的w3p崩溃到每天几次发生的随机OutOfMemoryExceptions。
我怀疑我们在这里滥用asp.net缓存,所以我重写了图像缓存以转到文件系统。我们的图像处理程序现在检查缓存目录中的已调整大小的图像,如果不存在这样的图像,则从数据库中取出它并将其保存在缓存目录中,并从那里提供它。
困扰我的是这个网站的内存使用w3p。之前,当我们使用asp.net缓存对象时,w3p的典型内存使用量约为600mb。现在,当处理程序从文件系统提供图像时,典型的内存使用量约为750mb。不知怎的,我预计它会下降(至少有点),但绝对不会上升。对此有任何解释吗?
第二,有没有办法检查w3p进程以查看有多少内存用于什么?我想到的一件事是性能计数器,但没有时间检查它。
答案 0 :(得分:1)
这只是我的猜测,但如果文件I / O被缓冲,那么会不会占用大量内存?或许比ASP缓存更可能需要缓冲而不是从缓存中获取共享资源。
至于内存分析,有很多分析程序可以用它们来分析正在发生的事情。
答案 1 :(得分:0)
您确定已禁用这些项目的OutputCache吗?您似乎仍然执行动态代码来确定是否在必要时创建已调整大小的图像,因此仍然可以有一个活动的OutputCache
答案 2 :(得分:0)
许多图像进入缓存会导致它增长和增长。当进程占用60%的可用内存时,asp.net的默认行为将重新启动。
当一个进程被回收并且第二个进程将被创建但是第一个进程很长时间没有完成时,可以抛出OutOfMemoryException。然后你有2个进程占用大量内存。如果应用程序繁忙并且有很多请求,则可能会有超过2个进程。这导致OutOfMemoryException。
我重写了图像缓存 文件系统。我们的图像处理器吧 检查缓存目录中已调整大小的图像, 如果不存在这样的图像,则获取它 从数据库中将其保存在缓存中 dir,并从那里服务。
这是最好的解决方案。 FileSystem在操作系统级别进行缓存。