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