18

我的服务器上有一个网站,我的 IIS 工作进程一直使用 4GB RAM。我应该检查什么?

c:\windows\system32\inetsrv\w3wp.exe
4

6 回答 6

16

我会检查Gulzar 提到的文档中的 CLR Tuning Section。

正如其他海报所指出的那样,任何实现的对象都IDispose应该Dispose()在完成时调用它,最好使用using构造。

启动perfmon.exe并添加这些计数器:

  • 进程\私有字节
  • .NET CLR 内存# 所有堆中的字节数
  • 流程\工作集
  • .NET CLR 内存\大对象堆大小

在所有堆计数器中的字节数保持不变的情况下,私有字节的增加表示非托管内存消耗。

两个计数器的增加表示托管内存消耗

于 2008-10-29T05:18:44.737 回答
6

查看Tuning .NET Application Performance中有关解决内存瓶颈问题的部分

于 2008-10-29T03:48:33.123 回答
3

创建 w3wp 进程的小型转储并使用 WinDbg 查看内存中的对象。这就是微软的 IIS 支持团队在遇到此类问题时所做的事情。

于 2008-10-29T08:42:30.503 回答
2

如果您有权访问源代码,您可能需要检查实现 IDisposable 的任何对象是否在using语句内部被引用或在您完成它们时被正确处置。

Using是一个 C# 构造,但基本思想是在完成后释放资源。

要检查的另一件事是大型对象被置于“进行中”会话状态或缓存中。

于 2008-10-29T04:06:17.470 回答
2

更多细节肯定会有所帮助。应用程序池中有多少应用程序正在运行?池中是否有 ASP.NET 应用程序?

如果您正在运行 ASP.NET,请仔细查看您在会话和缓存变量中存储的内容。使用 PerfMon 检查发生了多少第 0 代、第 1 代和第 2 代收集。小心将 UI 元素存储在会话状态或缓存中,因为这会阻止收集整个页面实例以及页面实例的所有子项。最后,检查您是否正在执行大量字符串连接。这会导致大量对象实例化,因为 .NET 字符串是不可变的。考虑改用 StringBuilder 。

于 2008-10-29T04:15:40.010 回答
0

正如其他人所指出的,此问题的常见原因是资源泄漏,win2k3 服务器和 IIS6 KB916984也存在一个已知问题

于 2008-10-29T05:38:32.153 回答