【问题标题】:C# service with Oracle .NET provider gets slower and slower使用 Oracle .NET 提供程序的 C# 服务变得越来越慢
【发布时间】:2010-10-08 22:22:24
【问题描述】:

我有一个为 .NET 2.0 编写的 C# 服务,它使用 .NET 2.102.2.20 的 Oracle 数据访问提供程序。该服务运行多个线程并对 Oracle 9.2 数据库运行大量查询。我正在使用 NHibernate。

我看到的是,当它启动时它运行得很快,然后变得越来越慢。 CPU使用率从低开始上升然后上升。几分钟后它开始爬行,CPU 达到 100%。我查看了我的代码,并没有发现任何可以这样做的东西。 GC 中的百分比时间

有人知道这是怎么回事吗?

更多细节: 线程是工作线程,需要一直运行。我没有失控的线程,他们正在做真正的工作。我已经对程序进行了概要分析,看起来它在 Oracle 提供程序中花费了大量时间,这是您所期望的,但为什么它会使用这么多 CPU?就好像它在等待结果集或其他东西一样旋转,但它不会立即发生,只是在一段时间后发生。

更新: 这可能与服务器上的 .NET CLR 有关。 一个执行大量字符串操作的多线程测试程序在这台机器上也显示出相同的行为,开始很快,然后在 15 分钟内减慢到大约 1/3 的速度。测试程序不会在具有相同操作系统版本和相同(我们认为).NET CLR 版本的另一台相同服务器上显示这种减速行为。

更新: 现在看起来这是服务器过热和热保护启动并减慢 CPU 频率的问题。

更新: 服务器的固件更新解决了这个问题。我仍然认为这是一个过热问题,因为如果我停止运行该进程并让服务器“休息”一会儿,当我重新启动该进程时它会开始快速运行,但如果我终止该进程并立即重新启动该进程将开始运行缓慢。我的猜测是风扇的固件控制出现故障,因此 CPU 会发热并变慢。如果我停止运行一段时间,它们会冷却下来并再次快速运行,直到它们再次升温。

【问题讨论】:

    标签: c# .net performance oracle


    【解决方案1】:

    听起来您的线程没有终止并一直在运行,或者您有一些严重的内存泄漏。如果没有更多信息,这可能是任何事情。

    【讨论】:

      【解决方案2】:

      如果 CPU 处于 100% 状态,您可能面临一个失控的线程。您可以使用 WinDbg + SoS 进行诊断。附加到进程并使用!runaway 命令获取每个线程正在使用多少CPU 的概览。然后使用!clrstack 找出失控线程在做什么。如果您需要更多详细信息,请告诉我。

      【讨论】:

      • 不是任何一个线程。都是他们。而且它们没有在我的代码中循环。
      • 好吧,有趣。既然你说他们都在做真正的工作,那么调用堆栈显示了什么?
      【解决方案3】:

      我遇到了完全相同的问题。 OracleConnection 越来越慢。有趣的是,如果我调用:

      cn.Close(); OracleConnection.ClearPool(cn);

      每一次,它都不会慢下来。

      一定和oracle连接有关(缓存??)

      【讨论】:

        猜你喜欢
        • 2016-11-03
        • 2018-04-21
        • 1970-01-01
        • 2016-06-12
        • 2021-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多