我有一个网站应用程序正在IIS 7.0的自己的应用程序池中运行。该应用程序是一个ASP.NET MVC 3网站。
我已经注意到此应用程序对应的w3wp IIS Worker服务的内存使用率非常高(800 MB,有一些波动)。
我正在尝试诊断问题,并尝试了以下操作:
我已在IIS级别上禁用了网站的输出页面缓存,然后回收了应用程序池。这将导致w3wp进程重新启动。然后,此过程的内存使用量缓慢增加到大约800 MB,大约需要30秒。目前没有正在处理的页面请求。当我从IIS重新启动网站时,进程的内存大小不会改变。
我已经尝试从VS 2010运行应用程序的调试副本,内存使用没有问题。
我的一些想法/问题是:
此问题与网站代码有关吗? -考虑到在发送/处理任何页面请求之前内存已激增,我认为这不是代码问题吗?
内置在MVC中的应用程序没有写入缓存的处理。
该网站使用实时显示数据,它定期使用ajax请求,并且通常长时间处于“打开”状态。
为什么在回收应用程序并且没有发送用户请求后,内存使用量会急剧上升?这是因为它正在将旧的缓存信息从磁盘加载到其内存中吗?
应用程序不会崩溃,我只是担心内存的使用,它不是一个很大的网站...
对于深入了解此问题的任何想法/帮助,将不胜感激。
我只是看了看服务器,我的池使用了900-1000 MB的虚拟大小内存和380 MB的工作集。几年来,我的网站运行顺利,没有出现问题,并且我已经从各个方面对网站进行了检查。我的池永不回收,服务器一直运行到下一次更新,并以40%的稳定可用物理内存连续进行。
如果您的内存没有持续增长,那么此内存就是代码加上您在应用程序内部设置为静态,常量,字符串和可能的缓存的数据。
您可以使用process explorer查看工作和虚拟大小的存储器。
您还可以考虑对您的代码运行配置文件,以查看是否存在“内存泄漏”或其他问题。从Google找到一个:https://www.google.com/search?hl=en&q=asp.net+memory+profiler。
如果您有能力使用调试器,那么最好的办法是安装Windows Debugging Tools并使用WinDbg和SOS.dll之类的东西来确切地确定内存中的内容。
一旦安装了工具,就可以:
此时,您应该能够看到按内存消耗量排序的所有类型,因此您可以从底部的类型开始。 (我建议排除String和Object,因为它们通常是副作用,而不是原因)。使用“!dumpheap -type type-here”来查找实例,并使用!gcroot来找出实例在内存中的原因,可能是由于静态字段,事件处理程序泄漏,未处置WCF通道或类似原因是常见的来源。
它可能不适用于这里,但我认为我会妥善处理。最近,我遇到了一个问题,那就是当确实可以清除80%的内存时,我的内存会立即增大并达到最大值。问题:它认为比实际多2个演出,因此GC非常懒惰。 (这是由于VM的软件错误-Windows报告8 Gig,但实际上只有6.4)。参见博客。http://www.worthalook.net/2014/01/give-back-memory/
可能有用的方法:如果您“重写”(打开/保存)web.config,则您的应用程序将重置,您应该从那时开始监视内存使用情况。如果它在使用过程中持续增长,则可能意味着内存泄漏或疯狂的缓存。您也许能够确定站点上的哪些操作导致内存增加。在很长一段时间内,应用程序的内存使用情况应该稳定。