我有一个为 .NET 2.0 编写的 C# 服务,它使用 .NET 2.102.2.20 的 Oracle 数据访问提供程序。该服务运行多个线程并对 Oracle 9.2 数据库运行大量查询。我正在使用 NHibernate。
我看到的是,当它启动时运行速度很快,然后变得越来越慢。 CPU 使用率开始很低,然后不断上升。几分钟后它开始爬行并且 CPU 达到 100%。我查看了我的代码,但没有发现可以执行此操作的任何内容。 GC 中的时间百分比 < 5%。我已尝试改变 ODP.NET 参数但无济于事。
有人知道这是怎么回事吗?
更多细节: 线程是工作线程,需要一直保持运行。我没有失控的线程,它们正在做真正的工作。我已经对程序进行了概要分析,看起来它在 Oracle 提供程序中花费了大量时间,这是您所期望的,但为什么它会使用这么多 CPU?就好像它在旋转等待结果集或其他东西,但它不会立即发生,只会在一段时间后发生。
更新: 这可能与服务器上的 .NET CLR 有关。 执行大量字符串操作的多线程测试程序在这台机器上也显示出相同的行为,开始时很快,然后在 15 分钟的过程中减慢到大约 1/3 的速度。测试程序在另一台具有相同操作系统版本和相同(我们认为).NET CLR 版本的相同服务器上没有显示这种减速行为。
更新: 现在看起来这是服务器过热和热保护启动并降低 CPU 频率的问题。
更新: 服务器的固件更新解决了这个问题。我仍然认为这是一个过热问题,因为如果我停止运行该进程并让服务器“休息”一会儿,当我重新启动该进程时它会开始快速运行,但如果我终止该进程并立即重新启动该进程会开始运行缓慢。我的猜测是风扇的固件控制出现故障,因此 CPU 会升温并减速。如果我停止跑一会儿,它们就会冷却下来并再次快速跑,直到它们再次变热。
最佳答案
听起来您的线程没有终止并一直保持运行,或者您有一些严重的内存泄漏。如果没有更多信息,这可能是任何东西。
关于使用 Oracle .NET 提供程序的 C# 服务变得越来越慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/571007/