【问题标题】:High memory usage with w3wp application pool IIS 7w3wp 应用程序池 IIS 7 的高内存使用率
【发布时间】:2012-03-28 19:27:03
【问题描述】:

我有一个网站应用程序在 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


    【解决方案1】:

    如果您有能力使用调试器,最好的办法是安装 Windows Debugging Tools 并使用 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 通道未释放或类似这是常见的来源。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 顺便说一句 - 您将处于 40% 的稳定状态,因为默认情况下 IIS 中的 processModel 仅限于使用 60% 的可用内存。您可以通过 processModel memoryLimit 设置更改此设置。
      • @ProVega 其实在 IIS 旁边,还有 ms sql server 和 ms 备份程序。 ms 备份程序可以吃掉所有的空闲内存,使系统变慢。然后 MS SQL 服务器也可以为缓存吃很多内存,所以我设置了内存最大限制。所以我最终有一些空闲内存,因为我已经检查过了。
      • 也在应用程序池的高级设置弹出窗口中,将启用 32 位应用程序设置为 true 也可以减少内存使用量。请参阅此帖子以获取信息sitefinity.com/developer-network/forums/bugs-issues-/…
      【解决方案3】:

      它可能不适用于这里,但我想我会把它扔进去。最近我遇到了一个问题,当我真的可以清理 80% 的内存时,我的内存会立即上升并达到最大值。问题:它认为它比实际多 2 gig,所以 GC 非常懒惰。 (这是由于 VM ware 错误-windows 报告 8 Gig 但实际上只有 6.4)。见博客。http://www.worthalook.net/2014/01/give-back-memory/

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2013-03-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-02
          • 1970-01-01
          • 1970-01-01
          • 2013-09-20
          • 2011-07-19
          相关资源
          最近更新 更多