我使用jvmtop几个月来监视JVM统计信息。当我用Jconsole计算输出时,我在jvmtop中也观察到了类似的统计信息。 但是,在最近的测试执行中,我观察到很少有CPU%的条目超过100%(最高的是120%)。现在,我相信jvmtop会提供累积的CPU使用率(与top不同,它提供了更多的内核方面的细节),因此需要有关如何解释超过100%使用率的条目的指导。
答案 0 :(得分:0)
我看过jvmtop code并可以得出结论,其用于计算CPU使用率的算法已经完全搞砸了。让我解释一下。
在简化形式下,公式看起来像
CPU_usage = Δ processCpuTime / ( Δ processRunTime * CPU_count)
这个想法很有道理,但问题在于它实际上是implemented。我至少看到3个问题:
Δ processCpuTime
和Δ processRunTime
是在不同的时间间隔内计算得出的,将它们彼此除以并不太正确。如果Δ processCpuTime
的计算时间长于Δ processRunTime
,则结果可能恰好是> 100%。OperatingSystemMXBean.getProcessCpuTime()
调用,而进程正常运行时间则取决于RuntimeMXBean.getUptime()
。问题是,这两种方法使用不同的时钟源和不同的时标。一般来说,通过这些方法获得的时间是无法相互比较的。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()));