【发布时间】: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