.NET 垃圾收集器使用的 CPU 的百分比是否是任何指标?

Is the percentage of CPU utlized by the .NET garbage collector an indicator of anything?

作为应用程序运行缓慢的解释,有人报告说垃圾收集器在收集期间占用了 CPU 的 17%。对我来说,这个统计数字听起来无关紧要,因为 17% 无论如何也没什么好担心的。此外,它是一个任意指标,无法告诉我有关进程内存构成的任何信息。

对我来说更相关的数据是:

  1. 我们有多少第 2 代合集?

  2. 显示内存转储,让我参与其中并返回给您。让我看看 heapstat(来自 psscorX 的!dumpheap -stat)、syncblocks 等

  3. 向我展示在缓慢的严重时期的 CPU 利用率,所以我知道这不是一个 I/O 绑定问题,要求将异步引入到设计中。

  4. 自启动可疑操作以来,我们进行了多少次垃圾回收,其中有多少次是完全回收?

  5. 显示 LOH 堆碎片。

  6. 显示非托管堆,进程中的空闲space和托管堆占用的总space。

  7. 分析代码并查看哪些内容需要时间。然后将花费最多时间的操作归零。

但是 CPU 垃圾收集的 运行 利用率?这对我来说似乎根本不是一个相关的指标。

所以,我请求确认。

  1. 是 GC 使用的 CPU 的指标,尤其是。当它只有 17% 时,是否表明应用程序存在问题?

  2. 是否存在 GC 通常应符合的预期阈值 CPU 利用率,以便被视为良好且健康的应用程序的正常收集?

我们讨论的是 CLR 工作站版本上的进程 运行。

经过一番搜索,我找到了一些关于这个主题的信息here

看来,在收集过程中检查 CPU 利用率可能会让人们深入了解是否发生了过多或过于频繁的收集。这可能意味着对象分配得太快 and/or 没有被释放,即存活时间太长(例如太多 class 级别的对象),因此垃圾收集器花费的时间更长,因为每个系列都没有太多可收集的。

我从文章中复制相关片段:

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

CPU usage will be high during a garbage collection. If a significant amount of process time is spent in a garbage collection, the number of collections is too frequent or the collection is lasting too long. An increased allocation rate of objects on the managed heap causes garbage collection to occur more frequently. Decreasing the allocation rate reduces the frequency of garbage collections.

You can monitor allocation rates by using the Allocated Bytes/second performance counter. For more information, see Performance Counters in the .NET Framework.

然而,这并没有评论 17% CPU 的利用率是否很高,因为它不应该。它确实提供了一个线索,建议我们查看每秒分配性能指标和 % Time 计数器。

垃圾收集是内存分配的副产品。 如果垃圾收集占用了 CPU 时间的 17%,则表明内存分配总体占用了更大的一部分,可能占 34%。 (当然,如果你的程序是 I/O 绑定的,CPU% 就不那么重要了。)

程序变慢的一种常见方式(或者用积极的话说,一种加快程序速度的常见方式)与可以避免的内存分配有关。 我使用 random pausing 方法来确定这些机会。

This link 探讨了一个示例,其中池化和重用对象而不是总是分配新对象是大幅加速之一。 似乎总是需要说明的是,程序通常有 不止一种 方法可以使程序运行得更快,因此性能调整可以分阶段进行。 因此,假设您现在在内存分配上花费了 100 秒中的 34 秒,并且假设您可以删除其中的 30 秒。然后时间缩短到 70 秒,加速为 100/70 = 1.43x。 现在几乎可以肯定还有其他事情(不一定是内存分配)需要 20 秒。它是 20/100 = 20%,但在解决第一个问题后它更多;它是 20/70 = 29%。 通过第一次加速,它按比例变大。 修复它可以得到 70/50 = 1.4 倍的加速。 如果您有多个问题并且您一次解决一个问题,它们的加速因子会成倍增加并且可能会非常显着。