使用Oracle .NET提供程序的C#服务变得越来越慢

时间:2009-02-20 19:55:01

标签: c# .net performance oracle

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

我所看到的是,当它启动时它会快速运行,然后变得越来越慢。 CPU使用率从低开始然后上升。几分钟后,它正在爬行,CPU处于100%。我查看了我的代码,发现没有什么可以做到这一点。 GC中的百分比时间<1。 5%。我试过改变ODP.NET参数无济于事。

任何人都知道可以做什么?

更多细节: 线程是工作线程,需要一直保持运行。我没有失控的线程,他们正在做真正的工作。我已经分析了该程序,看起来它花了很多时间在Oracle提供程序中,你会期望,但为什么它会使用这么多CPU?就好像它正在旋转等待结果集或其他东西,但它不会马上发生,只是过了一段时间。

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

更新: 现在看起来这是服务器过热和热保护的问题,并且会降低CPU的频率。

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

如果CPU达到100%,你可能面临一个失控的线程。您可以使用WinDbg + SoS进行诊断。附加到进程并使用!runaway命令来概述每个线程使用的CPU数量。然后使用!clrstack找出失控线程正在做什么。如果您需要其他详细信息,请与我们联系。

答案 2 :(得分:0)

我遇到了完全相同的问题。 OracleConnection逐渐变慢和变慢。有趣的是,如果我打电话:

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

每一次,它都不会减速。

它必须与oracle连接(缓存??)

有关