【发布时间】:2008-10-29 03:46:08
【问题描述】:
我的服务器上有一个网站,我的 IIS 工作进程一直使用 4GB RAM。我应该检查什么?
c:\windows\system32\inetsrv\w3wp.exe
【问题讨论】:
标签: asp.net iis memory worker-process
我的服务器上有一个网站,我的 IIS 工作进程一直使用 4GB RAM。我应该检查什么?
c:\windows\system32\inetsrv\w3wp.exe
【问题讨论】:
标签: asp.net iis memory worker-process
我会检查提到的document Gulzar 中的 CLR 调整部分。
正如其他海报所指出的,任何实现IDispose 的对象在完成时都应该调用Dispose(),最好使用using 构造。
启动perfmon.exe 并添加这些计数器:
- 进程\私有字节
- .NET CLR 内存# 所有堆中的字节数
- 流程\工作集
- .NET CLR 内存\大对象堆大小
私有字节增加,而 所有堆计数器中的字节数保持不变表示非托管 内存消耗。
增加 两个计数器都指示托管内存 消费
【讨论】:
查看Tuning .NET Application Performance中有关解决内存瓶颈问题的部分
【讨论】:
创建 w3wp 进程的小型转储并使用 WinDbg 查看内存中的对象。这就是微软的 IIS 支持团队在遇到此类问题时所做的事情。
【讨论】:
如果您有权访问源代码,您可能需要检查任何实现 IDisposable 的对象是否在 using 语句中被引用,或者在您完成它们后被正确处置。
Using 是一个 C# 构造,但基本思想是在完成后释放资源。
要检查的另一件事是大型对象被置于“进行中”会话状态或缓存中。
【讨论】:
更多细节肯定会有所帮助。应用程序池中有多少应用程序正在运行?池中是否有 ASP.NET 应用程序?
如果您正在运行 ASP.NET,请仔细查看您在会话和缓存变量中存储的内容。使用 PerfMon 检查发生了多少第 0、1 和 2 代收集。小心将 UI 元素存储在会话状态或缓存中,因为这会阻止收集整个页面实例和所有页面实例的子项。最后,检查您是否正在执行大量字符串连接。这可能会导致大量对象实例化,因为 .NET 字符串是不可变的。考虑改用 StringBuilder。
【讨论】:
正如其他人指出的,此问题的常见原因是资源泄漏,win2k3 服务器和 IIS6 也存在一个已知问题KB916984
【讨论】: