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