代码之家  ›  专栏  ›  技术社区  ›  Carlos A. Ibarra

C#为甲骨文提供服务。网络提供商变得越来越慢

  •  2
  • Carlos A. Ibarra  · 技术社区  · 15 年前

    我有一个C#service服务。NET 2.0,它使用Oracle数据访问提供程序来访问。净2.102.2.20。该服务运行多个线程,并对Oracle 9.2数据库执行大量查询。我用的是NHibernate。

    我看到的是,当它启动时,它运行得很快,然后变得越来越慢。CPU使用率从低到高。几分钟后,它开始爬行,CPU达到100%。我查看了我的代码,但没有发现任何可以这样做的东西。GC中的时间百分比为<5%. 我试过改变ODP。NET参数无效。

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

    更多细节: 这些线程是工作线程,需要一直运行。我没有失控的线程,他们正在做真正的工作。我已经分析了这个程序,它看起来像是在Oracle提供程序中花费了大量时间,这是你所期待的,但为什么它会使用这么多CPU?这就像是在等待结果集之类的东西,但它不会马上发生,只会在一段时间后发生。

    更新: 这可能是因为。服务器上的NET CLR。 执行大量字符串操作的多线程测试程序在这台机器上也显示出相同的行为,快速启动,然后在15分钟的过程中减速到大约1/3的速度。测试程序没有在另一台相同的服务器上显示这种减速行为,该服务器具有相同的OS版本和相同的(我们认为)。NET CLR版本。

    更新: 现在看来,这是一个服务器过热和热保护问题,导致CPU频率降低。

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

    3 回复  |  直到 14 年前
        1
  •  1
  •   schnaader    15 年前

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

        2
  •  0
  •   Brian Rasmussen    15 年前

    如果CPU是100%,你可能会面临失控的线程。您可以使用WinDbg+SoS诊断。附加到流程并使用 !runaway 命令获取每个线程使用的CPU量的概览。然后使用 !clrstack 找出失控的线程在做什么。如果你需要更多细节,请告诉我。

        3
  •  0
  •   Fidel    15 年前

    我得到了完全相同的问题。OracleConnection越来越慢。有趣的是,如果我打电话:

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

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

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