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

问题描述 投票:24回答:4

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

我已经注意到此应用程序对应的w3wp IIS Worker服务的内存使用率非常高(800 MB,有一些波动)。

我正在尝试诊断问题,并尝试了以下操作:

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

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

我的一些想法/问题是:

此问题与网站代码有关吗? -考虑到在发送/处理任何页面请求之前内存已激增,我认为这不是代码问题吗?

内置在MVC中的应用程序没有写入缓存的处理。

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

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

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

对于深入了解此问题的任何想法/帮助,将不胜感激。

asp.net iis memory iis-7
4个回答
14
投票

我只是看了看服务器,我的池使用了900-1000 MB的虚拟大小内存和380 MB的工作集。几年来,我的网站运行顺利,没有出现问题,并且我已经从各个方面对网站进行了检查。我的池永不回收,服务器一直运行到下一次更新,并以40%的稳定可用物理内存连续进行。

如果您的内存没有持续增长,那么此内存就是代码加上您在应用程序内部设置为静态,常量,字符串和可能的缓存的数据。

您可以使用process explorer查看工作和虚拟大小的存储器。

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


18
投票

如果您有能力使用调试器,那么最好的办法是安装Windows Debugging Tools并使用WinDbg和SOS.dll之类的东西来确切地确定内存中的内容。

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

  1. 启动Windbg.exe以提升的身份运行(以管理员身份)
  2. 使用“文件->附加到进程”,然后为要尝试找出的应用选择w3wp.exe。如果您有很多,则可以使用任务管理器并添加命令行列以查看PID,或使用IIS管理器->“工作进程”来找出它,然后在WinDBG中选择该进程。
  3. 运行:
  4. 。loadby sos clr
  5. !dumpheap -stat

此时,您应该能够看到按内存消耗量排序的所有类型,因此您可以从底部的类型开始。 (我建议排除String和Object,因为它们通常是副作用,而不是原因)。使用“!dumpheap -type type-here”来查找实例,并使用!gcroot来找出实例在内存中的原因,可能是由于静态字段,事件处理程序泄漏,未处置WCF通道或类似原因是常见的来源。


3
投票

它可能不适用于这里,但我认为我会妥善处理。最近,我遇到了一个问题,那就是当确实可以清除80%的内存时,我的内存会立即增大并达到最大值。问题:它认为比实际多2个演出,因此GC非常懒惰。 (这是由于VM的软件错误-Windows报告8 Gig,但实际上只有6.4)。参见博客。http://www.worthalook.net/2014/01/give-back-memory/


0
投票

可能有用的方法:如果您“重写”(打开/保存)web.config,则您的应用程序将重置,您应该从那时开始监视内存使用情况。如果它在使用过程中持续增长,则可能意味着内存泄漏或疯狂的缓存。您也许能够确定站点上的哪些操作导致内存增加。在很长一段时间内,应用程序的内存使用情况应该稳定。

© www.soinside.com 2019 - 2024. All rights reserved.