簡體   English   中英

使用Oracle .NET提供程序的C#服務越來越慢

[英]C# service with Oracle .NET provider gets slower and slower

我有一個為.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的速度。 在具有相同OS版本和相同(我們認為).NET CLR版本的另一台相同服務器上,測試程序未顯示這種減速行為。

更新:現在看來這是服務器過熱和熱保護啟動並降低CPU頻率的問題。

更新:服務器的固件更新已解決此問題。 我仍然認為這是一個過熱的問題,因為如果我停止運行該進程並讓服務器“休息”一會兒,則在重新啟動該進程時它將快速運行,但是如果我終止了該進程並立即重新啟動了該進程將開始已經運行緩慢。 我的猜測是風扇的固件控制出現故障,因此CPU會變熱和變慢。 如果我停止運行一會兒,它們會冷卻並再次快速運行,直到它們再次升溫。

聽起來您的線程沒有被終止並且一直保持運行狀態,或者您遇到了嚴重的內存泄漏。 沒有更多信息,這可能是任何事情。

我遇到了完全相同的問題。 OracleConnection越來越慢。 有趣的是,如果我打電話:

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

每次,它都不會減慢速度。

它必須與oracle連接有關(緩存?)

如果CPU處於100%狀態,您可能會面臨失控的線程。 您可以使用WinDbg + SoS進行診斷。 附加到該進程,並使用!runaway命令獲得每個線程正在使用多少CPU的概述。 然后使用!clrstack找出失控線程在做什么。 讓我知道您是否需要其他詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM