jvmtop CPU使用率> 100%

时间:2020-10-02 07:10:11

标签: performance jvm cpu-usage

我使用jvmtop几个月来监视JVM统计信息。当我用Jconsole计算输出时,我在jvmtop中也观察到了类似的统计信息。 但是,在最近的测试执行中,我观察到很少有CPU%的条目超过100%(最高的是120%)。现在,我相信jvmtop会提供累积的CPU使用率(与top不同,它提供了更多的内核方面的细节),因此需要有关如何解释超过100%使用率的条目的指导。

1 个答案:

答案 0 :(得分:0)

我看过jvmtop code并可以得出结论,其用于计算CPU使用率的算法已经完全搞砸了。让我解释一下。

在简化形式下,公式看起来像

    CPU_usage = Δ processCpuTime / ( Δ processRunTime * CPU_count)

这个想法很有道理,但问题在于它实际上是implemented。我至少看到3个问题:

  1. 进程CPU时间和进程正常运行时间是通过两个独立的方法调用获得的。此外,这些是通过RMI进行的远程调用。这意味着,在获取这些值之间可能会有任意长的延迟。因此,Δ processCpuTimeΔ processRunTime是在不同的时间间隔内计算得出的,将它们彼此除以并不太正确。如果Δ processCpuTime的计算时间长于Δ processRunTime,则结果可能恰好是> 100%。
  2. 进程CPU时间基于OperatingSystemMXBean.getProcessCpuTime()调用,而进程正常运行时间则取决于RuntimeMXBean.getUptime()。问题是,这两种方法使用不同的时钟源和不同的时标。一般来说,通过这些方法获得的时间是无法相互比较的。
  3. CPU_count计算为OperatingSystemMXBean.getAvailableProcessors()。但是,JVM可见的逻辑处理器数量并不总是等于机器上的物理处理器数量。例如,在容器getAvailableProcessors()中可能返回基于cpu-shares的值,而实际上JVM可能会使用更多的物理核。在这种情况下,CPU使用率可能会再次出现> 100%。

但是,据我所知,在the latest version中,CPU负载的最终值被人为限制为99%:

    return Math.min(99.0,
        deltaTime / (deltaUptime * osBean.getAvailableProcessors()));