IIS工作进程使用大量内存?

时间:2008-10-29 03:46:09

标签: asp.net iis memory worker-process

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

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

6 个答案:

答案 0 :(得分:12)

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

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

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

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

私人字节数增加   所有堆计数器中的字节数保持不变表示不受管理   记忆消耗。

     

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

答案 1 :(得分:5)

查看有关Tuning .NET Application Performance

中内存瓶颈问题的部分

答案 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

也存在已知问题