2015-11-27 41 views
4

我有一個多線程的過程。每個線程都受CPU限制(執行計算),並使用大量內存。根據資源監視器,該進程從100%cpu利用率開始,但幾個小時後,cpu利用率開始緩慢下降。 24小時後,它在90-95%下降。隨着時間的推移CPU利用率下降

問題是 - 我應該查找什麼,以及可以使用哪些最知名的方法進行調試?

附加信息:

我有足夠的RAM - 大部分是未使用在任何特定時刻。根據perfmon - 內存不增長(所以我不認爲它泄漏)。代碼是.Net和本地C++的混合體,有些數據來回編組。 我在幾臺不同的機器上看到了這個(有24個邏輯核心的服務器)。 我在perfmon中看到的一件事 - 隨着CPU利用率的降低,修改頁面列表字節指示器隨着時間的推移而增加。

編輯1 使用的第三方庫之一是openfst。看起來這與圖書館的一些誤用非常相關。 具體來說,我注意到我有以下警告: 警告LNK4087:CONSTANT關鍵字已過時;利用數據

編輯2

由於問題被關閉,並沒有重開,我會寫我的調查結果和問題是如何在這個問題的解決身體(對不起),用於未來用戶。 原來有一個openfst.def文件,它定義了消耗應用程序/ dll所使用的所有openfst FLAGS_ *符號。我不得不修復那些使用關鍵字「DATA」而不是「CONSTANT」(CONSTANT已過時,因爲它有風險 - 更多信息:https://msdn.microsoft.com/en-us/library/aa271769(v=vs.60).aspx)。之後 - 沒有觀察到更多的CPU利用率下降。 「修改的頁面列表字節」指示器不再增加。我懷疑它與FLAGS的默認值(特別是垃圾收集標誌--FLAGS_fst_default_cache_gc)有關,因爲openfst.def文件中CONSTANT關鍵字的錯誤使用,它們是非確定性的。

結論瞭解您的警告!儘可能地消除它們! 謝謝。

+0

使用一個分析器,在開始時取一個樣本,當慢時候取一個樣本,比較兩者。 –

+0

非常隨機猜測 - 內存碎片導致內存管理需要更長的時間? – SergeyA

+1

如果CPU使用率低於100%,這是因爲SOMETHING阻止了您的進程運行。最有可能的是你實際上內存不足,需要交換。 –

回答

0

對於這樣的非顯而易見的問題,您還應該使用一個事件探查器實際對CPU中的底層硬件計數器進行採樣。大多數我熟悉的分析器使用內核提供的統計信息,而不是底層的硬件計數器。在Windows中尤其如此。 (部分原因是Windows希望其內核統計信息獨立於硬件,PAPI API試圖解決這個問題,但仍然相對較新)。

其中一個最好的分析器是英特爾的VTune。是的,我爲英特爾工作,但內部HPC人員也使用VTune。不幸的是,它的成本。如果你是學生,有折扣。如果沒有,則有試用期。

您可以在software.intel.com上找到很多優化和性能問題診斷信息。這裏是optimizationprofiling的指針。即使您不使用x86架構,這些技術仍然有效。

至於什麼可能是這個問題,緩慢的退化是奇怪的。

  • 您多久使用一次新內存或訪問舊內存?以什麼速度?如果費率非常低,您可能仍然會遇到放慢使用資源的情況,例如,頁面。
  • 你的內存訪問模式是什麼?它隨時間變化嗎?有多快?也許隨着時間的推移,你的內存訪問模式正在蔓延,導致更多的緩存未命中。
  • 也許你對問題空間的劃分是這樣的,你進入了一個新的計算領域,並沒有真正的病理。
  • 看看是否有定期維護活動發生在較長的時間間隔內,儘管這會導致週期性退化,比如說每24小時。這聽起來不像你的情況,因爲你正在經歷的是逐漸退化。

如果您使用的是x86架構,考慮英特爾論壇(如「英特爾®集羣和高性能計算技術」和「軟件優化,性能優化&平臺監控」)提交的問題。

讓我們知道你最終發現什麼。

相關問題