2009-02-20 70 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連接有關(緩存??)