我的服务器上有一个网站,我的 IIS 工作进程一直使用 4GB RAM。我应该检查什么?
c:\windows\system32\inetsrv\w3wp.exe
我的服务器上有一个网站,我的 IIS 工作进程一直使用 4GB RAM。我应该检查什么?
c:\windows\system32\inetsrv\w3wp.exe
我会检查Gulzar 提到的文档中的 CLR Tuning Section。
正如其他海报所指出的那样,任何实现的对象都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 。