asp.net - w3wp 应用程序池 IIS 7 的高内存使用率

标签 asp.net iis memory iis-7

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

我注意到这个应用程序对应的 w3wp IIS worker 服务的内存使用率很高(800 MB,有一些波动)。

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

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

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

我的一些想法/问题是:

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

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

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

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

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

任何有助于解决这个问题的想法/帮助将不胜感激。

最佳答案

如果您有能力使用调试器,最好的办法是安装 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 channel 未处理或类似的事情这是常见的来源。

关于asp.net - w3wp 应用程序池 IIS 7 的高内存使用率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9666356/

相关文章:

sql-server - SQL Server 进程内存的很大一部分已被调出

android - Android 是如何管理内存的?

asp.net - 使用 Azure 在 ASP.net 中流式传输视频的最佳方式是什么?

c# - 绝对 URL 不适用于虚拟目录?

asp.net - 在 Umbraco 和 Orchard ASP.NET CMS 之间做出决定

c# - 身份服务器 4 : Proper logout from MVC Client

asp.net-mvc - 通过代码请求客户端证书

asp.net - Application_Error 在不同线程上触发

c# - 403.14 - 发布 Asp.Net Core 应用程序

java - 静态变量的实际内存位置是什么?