jvmtop CPU 使用率 >100%

jvmtop CPU usage >100%

几个月来我一直在使用 jvmtop 来监视 JVM 统计信息。当我用 Jconsole 计算输出时,我在 jvmtop 中也观察到了类似的统计数据。 然而,在最近的一次测试执行中,我观察到很少有 CPU% 的条目超过 100%(120% 是最高的)。现在我相信 jvmtop 提供累积 CPU 使用(不像 top 提供更多核心细节),需要关于如何解释超过 100% 使用的条目的指导。

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

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

    CPU_usage = Δ processCpuTime / ( Δ processRunTime * CPU_count)

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

  1. 进程CPU时间和进程正常运行时间是通过两个独立的方法调用获得的。此外,这些是通过 RMI 进行的远程调用。这意味着,在获取这些值之间可能存在任意长的延迟。因此,Δ processCpuTimeΔ processRunTime 是在不同的时间间隔内计算的,将它们相除并不完全正确。当 Δ processCpuTime 的计算周期比 Δ processRunTime 长时,结果可能恰好 > 100%。
  2. 处理 CPU 时间基于 OperatingSystemMXBean.getProcessCpuTime() call, while the process uptime relies on RuntimeMXBean.getUptime()。问题是,这两种方法使用不同的时钟源和不同的时间尺度。一般来说,这几种方法得到的时间是没有可比性的。
  3. CPU_count 计算为 OperatingSystemMXBean.getAvailableProcessors()。但是,JVM 可见的逻辑处理器数并不总是等于机器上的物理处理器数。例如,在容器中 getAvailableProcessors() 可能 return 基于 cpu-shares 的值,而实际上 JVM 可能使用更多的物理内核。在这种情况下,CPU 使用率可能再次 > 100%。

然而,据我所知,在 the latest version 中 CPU load 的最终值被人为地限制了 99%:

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