【问题标题】:IIS Worker Process using a LOT of memory?IIS 工作进程使用大量内存?
【发布时间】:2008-10-29 03:46:08
【问题描述】:

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

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

【问题讨论】:

    标签: asp.net iis memory worker-process


    【解决方案1】:

    我会检查提到的document Gulzar 中的 CLR 调整部分。

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

            【解决方案5】:

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

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

            【讨论】:

            • 是的,但是如果字符串在大对象堆上,如果我没记错的话,它们只会在 Gen 2 收集期间被收集。
            【解决方案6】:

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

            【讨论】:

            • 我认为这是问题所在......但我已经有了 SP2。 :(
            猜你喜欢
            • 2014-05-19
            • 2020-03-15
            • 2014-04-01
            • 1970-01-01
            • 2015-07-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-04-06
            相关资源
            最近更新 更多