2017-04-02 60 views
0

作爲應用程序緩慢的解釋,有人報告說垃圾收集器在收集過程中佔用了17%的CPU。對我而言,這個統計數據聽起來毫不相關,因爲17%不會太擔心。此外,這是一個任意的度量標準,並沒有告訴我有關進程內存構成的任何信息。.NET垃圾收集器使用的CPU百分比是否是任何指標?

什麼會比較相關數據,我會喜歡的東西:

  1. 多少Gen 2件的藏品沒有我們?

  2. 讓我看看內存轉儲,讓我和它一起聚會回來給你。讓我看看heapstat(!dumpheap -stat從psscorX),同步塊等

  3. 告訴我在緩慢的重週期的CPU使用率,所以我知道它不是一個I/O限制的問題,這是在哀求引入異步的成設計。

  4. 我們沒有多少垃圾收集有因爲我們推出嫌疑人的操作和有多少人是完全收集?

  5. 讓我看看LOH堆碎片。

  6. 告訴我非託管堆中,在這個過程中的自由空間,並通過託管堆佔據的總空間。

  7. 剖析代碼並查看需要花費的時間。然後再進行花費最多時間的操作。

但是垃圾收集運行持有的CPU利用率?這對我來說似乎不是一個相關的指標。

所以,我要求確認。

  1. 是GC使用的CPU的度量標準,當它只有17%時,這是一個相關的應用問題指標?

  2. 是否有預期的閾值的CPU利用率的GC通常應在以被認爲是一個很好的和健康的應用程序的正常收集合適?

我們正在討論在工作站版本的CLR上運行的進程。

回答

2

垃圾回收是內存分配的副產品。 如果垃圾收集佔用CPU時間的17%,則表明內存分配整體佔用的比例較大,例如34%。 (當然,如果你的程序是I/O綁定的,CPU%就不那麼重要了。)

程序慢一個常見的方式(或者說用積極的術語來說,是加快程序的常用方法)與可以避免的內存分配有關。 我使用random pausing方法來確定這些機會。

This link探索一個例子,其中彙集和重用對象,而不是總是分配新的對象,是一個大型的加速。 總而言之,需要說的是,程序通常會有一個以上的方式來加快速度,因此性能調整可以分階段進行。 因此,假設你現在在內存分配上花費了100分之三十四的時間,假設你可以刪除其中的30個。然後時間縮短到70秒,加速100/70 = 1.43x。 現在幾乎可以肯定有其他東西(不一定是內存分配)需要20秒。這是20/100 = 20%,但在解決第一個問題之後更是如此;它是20/70 = 29%。 第一次加速比例變大了。 修復它提供了70/50 = 1.4x的加速。 如果您遇到多個問題並且一次只修復一個問題,那麼它們的加速因子會一起增加,並且可能會非常顯着。

0

經過一番搜索,我發現這個話題here一些信息。

看來,一個收集過程中檢查CPU使用率可能會給一個一些洞察到太多或太頻繁了一些藏品是否正在發生。這可能意味着對象分配速度過快和/或沒有被釋放,即活動時間過長(例如太多的課堂級對象),因此它將垃圾收集器的時間延長,因爲沒有太多收集在每個集合中。

我複製的相關片段從文章:

Garbage Collection and Performance - >Issue: CPU Usage During a Garbage Collection Is Too High

CPU使用率將是一個垃圾收集過程中的高。如果在垃圾收集中花費了大量的處理時間,則收集的數量過於頻繁或收集持續時間過長。 增加分配給託管堆上的對象的分配率導致 垃圾回收發生得更頻繁。減少分配率可以減少垃圾收集的頻率。

您可以使用分配字節數/秒 性能計數器來監視分配率。有關更多信息,請參閱Performance Counters in the .NET Framework

但是,這並不會評論17%的CPU利用率是否高,因爲它不應該這樣做。它確實提供了一個建議,即我們研究每秒分配的性能指標和% Time計數器。