【问题标题】:jvmtop CPU usage >100%jvmtop CPU 使用率 >100%
【发布时间】:2020-10-02 07:10:11
【问题描述】:

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

【问题讨论】:

  • 我对 jvmtop 不是很熟悉,但可能只是测量错误。

标签: performance jvm cpu-usage


【解决方案1】:

我查看了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()));

【讨论】:

    猜你喜欢
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 2018-03-06
    相关资源
    最近更新 更多