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 个问题:
- 进程CPU时间和进程正常运行时间是通过两个独立的方法调用获得的。此外,这些是通过 RMI 进行的远程调用。这意味着,在获取这些值之间可能存在任意长的延迟。因此,
Δ processCpuTime
和 Δ processRunTime
是在不同的时间间隔内计算的,将它们相除并不完全正确。当 Δ processCpuTime
的计算周期比 Δ processRunTime
长时,结果可能恰好 > 100%。
- 处理 CPU 时间基于
OperatingSystemMXBean.getProcessCpuTime()
call, while the process uptime relies on RuntimeMXBean.getUptime()
。问题是,这两种方法使用不同的时钟源和不同的时间尺度。一般来说,这几种方法得到的时间是没有可比性的。
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()));
几个月来我一直在使用 jvmtop 来监视 JVM 统计信息。当我用 Jconsole 计算输出时,我在 jvmtop 中也观察到了类似的统计数据。 然而,在最近的一次测试执行中,我观察到很少有 CPU% 的条目超过 100%(120% 是最高的)。现在我相信 jvmtop 提供累积 CPU 使用(不像 top 提供更多核心细节),需要关于如何解释超过 100% 使用的条目的指导。
我查看了 jvmtop code 并得出结论,其计算 CPU 使用率的算法完全搞砸了。让我解释一下。
在简化形式中,公式看起来像
CPU_usage = Δ processCpuTime / ( Δ processRunTime * CPU_count)
这个想法是有道理的,但问题是它实际上是怎样的implemented。我至少看到 3 个问题:
- 进程CPU时间和进程正常运行时间是通过两个独立的方法调用获得的。此外,这些是通过 RMI 进行的远程调用。这意味着,在获取这些值之间可能存在任意长的延迟。因此,
Δ processCpuTime
和Δ processRunTime
是在不同的时间间隔内计算的,将它们相除并不完全正确。当Δ processCpuTime
的计算周期比Δ processRunTime
长时,结果可能恰好 > 100%。 - 处理 CPU 时间基于
OperatingSystemMXBean.getProcessCpuTime()
call, while the process uptime relies onRuntimeMXBean.getUptime()
。问题是,这两种方法使用不同的时钟源和不同的时间尺度。一般来说,这几种方法得到的时间是没有可比性的。 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()));