w3wp应用程序池IIS 7的高内存使用率

use*_*056 23 memory asp.net iis iis-7

我有一个网站应用程序在IIS 7.0上运行它自己的应用程序池.该应用程序是一个ASP.NET MVC 3网站.

我注意到这个应用程序的内存使用情况对应w3wp IIS工作服务是相当高的(800 MB,有一些波动).

我正在尝试诊断问题,并尝试了以下方法:

我已在IIS级别禁用网站的输出页面缓存,然后回收应用程序池.这会导致w3wp进程重新启动.然后,此过程的内存使用量会慢慢增加到大约800 MB,这需要大约30秒才能完成.目前没有处理页面请求.当我从IIS重新启动网站时,进程的内存大小不会改变.

我尝试从VS 2010运行应用程序的调试副本,内存使用没有问题.

我有一些想法/问题是:

这个问题与网站代码有关吗? - 鉴于在发送/处理任何页面请求之前内存火箭,我会认为这不是代码问题?

在MVC中构建的应用程序没有处理写入其中的缓存.

该网站使用实时数据显示,它定期使用ajax请求,并且通常长时间保持"开放"状态.

在应用程序被回收并且没有发送用户请求之后,为什么内存使用量会增加?这是因为它将旧的缓存信息从磁盘加载到它的内存中吗?

应用程序不会崩溃,我只关心内存使用情况,它不是一个网站的大...

任何想法/帮助解决这个问题的底部将不胜感激.

Car*_*res 18

最好的事情做,如果你能负担得起使用调试器安装的Windows调试工具,并使用类似的WinDbg和SOS.dll弄清楚到底什么是它在内存中.

一旦安装了工具,您就可以:

  1. 启动Windbg.exe运行提升(以管理员身份)
  2. 使用"文件 - >附加到进程"并为您要解决的应用程序选择w3wp.exe.如果你有很多,你可以使用任务管理器,并添加命令行栏中的PID或使用IIS管理器 - >工作进程来弄明白,然后选择在WinDbg中这一进程.
  3. 跑:
  4. .loadby sos clr
  5. !dumpheap -stat

在这一点上,你应该能够看到最内存消耗来分类的,所以你可以用那些在底部开始的所有类型.(我建议排除字符串和对象,因为这些通常是副作用而不是原因).使用"!dumpheap型类型,在这里"找到实例和使用!gcroot对于那些要弄清楚他们为什么在内存中,可能是由于静态字段,或者一个事件处理程序泄露,WCF频道不处置,或者类似的东西这是常见的来源.


Ari*_*tos 14

我只看我的服务器和我的池使用900-1000MB虚拟大小的内存和380MB工作集.我的网站现在运行顺利,问题多年了,我已经从各方面检查了它们.我的池永远不会回收,服务器一直运行,直到下一次更新继续使用40%稳定的可用物理内存.

如果你的内存没有继续增长,那么这个内存就是代码加上你在应用程序中设置为static,const,string和可能的缓存的数据.

您可以使用进程资源管理器查看工作和虚拟大小内存.

您还可以考虑针对您的代码运行配置文件,以查看是否存在任何"内存泄漏"或其他问题.从谷歌找到一个:https://www.google.com/search?hl = en & q = asp.net+memory + profiler.