2009-02-20 86 views
2

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

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

任何人都有一个想法可以做到这一点?

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

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

更新: 它现在看起来像是服务器过热和热保护踢入CPU并降低CPU频率的问题。

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

回答

1

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

0

如果CPU处于100%,您可能会面临失控的线程。你可以使用WinDbg + SoS来诊断。附加到进程并使用!runaway命令获得每个线程正在使用多少CPU的概述。然后用!clrstack找出失控线程正在做什么。让我知道如果你需要更多的细节。

+0

它不是任何一个线程。这都是他们。而且他们没有在我的代码中循环。 – 2009-02-20 20:09:51

0

我得到完全相同的问题。 OracleConnection逐渐变得越来越慢。有趣的是,如果我称之为:

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

每次

,它永远不会减慢。

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