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

24

我在IIS 7.0上运行一个独立应用程序池的网站应用,它是一个ASP.NET MVC 3网站。发现该应用程序对应的w3wp IIS工作服务的内存使用率相当高(800 MB,有些波动)。

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

我在IIS级别禁用了网站的输出页面缓存,然后重新启动了应用程序池。这会导致w3wp进程重新启动。该进程的内存使用率随后慢慢增长到约800 MB,需要大约30秒的时间。此时没有处理任何页面请求。当我从IIS重新启动网站时,进程的内存大小不会改变。

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

我有一些想法/问题:

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

建立在MVC中的应用程序没有编写任何缓存处理。

该网站使用实时数据显示,定期使用ajax请求,并且通常处于“打开”状态很长一段时间。

为什么应用程序被回收后没有发送任何用户请求,内存使用率会急剧增加?这是因为它正在从磁盘加载旧的缓存信息到其内存中吗?

应用程序并没有崩溃,我只是担心内存使用情况。这不是一个很大的网站......

如果您有任何想法/帮助,以解决这个问题,将不胜感激。

4个回答

18
如果你有足够的资金使用调试器,最好安装Windows调试工具,并使用类似WinDbg和SOS.dll这样的工具来确切地了解内存中发生了什么。
安装完工具后,您可以执行以下操作:
  1. 以管理员权限运行Windbg.exe
  2. 使用“文件->附加到进程”并选择w3wp.exe作为要查找的应用程序。如果有多个,您可以使用任务管理器并添加命令行列来查看PID,或者使用IIS管理器->工作进程来找到它,然后在WinDBG中选择该进程。
  3. 运行:
  4. .loadby sos clr
  5. !dumpheap -stat
此时,您应该能够看到按内存使用量排序的所有类型,因此您可以从底部开始处理它们。(我建议排除字符串和对象,因为它们通常是副作用而不是原因)。 使用“!dumpheap -type type-here”查找实例,并使用!gcroot查找其中的原因,可能是由于静态字段、事件处理程序泄漏、未释放的WCF通道等常见来源。

14

我刚才查看了我的服务器和池,发现它们使用了900-1000 MB的虚拟大小内存和380 MB的工作集。我的网站运行流畅,多年来从各个方面都进行了检查。我的池不会循环使用,服务器保持40%稳定的空闲物理内存连续运行,直到下次更新。

如果您的内存不断增长,则这些内存是应用程序中设置为静态、常量、字符串和可能缓存的数据加上代码所占用的内存。

您可以使用Process Explorer查看工作集和虚拟大小内存。

您还可以考虑对您的代码运行分析,以查看是否存在任何“内存泄漏”或其他问题。在Google中查找一个:https://www.google.com/search?hl=en&q=asp.net+memory+profiler


1
顺便提一下 - 默认情况下,IIS中的processModel受限于仅使用可用内存的60%,因此您将处于40%的稳定状态。 您可以通过processModel memoryLimit设置更改此设置。 - ProVega
@ProVega 实际上除了IIS之外,还有MS SQL服务器和MS备份程序。 MS备份程序可能会占用所有空闲内存,使系统变慢。然后MS SQL服务器也可以为缓存占用大量内存,因此我已经设置了内存最大限制。所以我最终有一些可用内存,因为我已经检查过了。 - Aristos
同样在应用程序池的高级设置弹出窗口中,将“启用32位应用程序”设置为true也可以减少内存使用量。请参阅此帖子获取信息 http://www.sitefinity.com/developer-network/forums/bugs-issues-/app-pool-memory-drastically-different-from-32-64-bit - Arjun Vachhani

3

这段内容可能与此处无关,但我觉得为了保险起见还是加上。最近我遇到一个问题,我的内存会飙升并且一直达到最高点,而实际上它本可以释放80%的内存。问题出在:它认为自己有比实际多2G的内存,所以垃圾回收器非常懒惰。(这是由于VMware的一个bug引起的——Windows报告有8G的内存,但实际只有6.4G)。详见博客:http://www.worthalook.net/2014/01/give-back-memory/


0
有一些可能会有帮助的东西:如果你“重写”(打开/保存)web.config文件,那么你的应用程序将会重置,你应该从那个点开始监视内存使用情况。如果在使用过程中它不断增长,这可能意味着内存泄漏或疯狂缓存。你可能能够确定哪些操作会导致内存增加。在很长一段时间内,应用程序的内存使用应该是稳定的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接