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