Java VisualVM CPU 使用情况和处理器关联
Java VisualVM CPU usage and processor affinity
根据我今天的经验,我发现 Oracle 的 Java VisualVM 显示 cpu 使用率占机器内核总数的百分比,即使被监视的 JVM 在 OS。这是在 "monitor" 选项卡中。
使用 taskset
限制受监控的 jvm(在 linux、Ubuntu 上),当允许该 jvm 的处理器在 htop
中接近 100% 利用率时, VisualVM 中显示的 cpu 百分比显然等于 cpu 的总数除以允许监视的 jvm 的处理器数。因此,秤的分辨率对于这种情况是不够的。
您能否确认您在其他操作系统或一般情况下观察到相同情况?
有没有办法让 VisualVM 在显示 cpu 使用情况时仅考虑关联分配的核心?
根据 VisualVM source code,CPU 使用确实计算为总 CPU 时间除以处理器数量:
long processCpuTime = tracksProcessCpuTime ?
model.getProcessCpuTime() / processorsCount : -1;
其中 processorsCount 是从 OperatingSystemMXBean:
获得的
OperatingSystemMXBean osbean = mxbeans.getOperatingSystemMXBean();
if (osbean != null) processorsCount = osbean.getAvailableProcessors();
存在一个长期存在的 JVM 错误 JDK-6515172,即未考虑进程亲缘关系,即 getAvailableProcessors 始终返回 [=32] 的总数=]s 无论任务集如何。这是 Linux 和 BSD 特有的;在 Solaris 和 Windows.
上正常工作
大约一个月前,这个错误终于被解决了。但是,此修复仅适用于 JDK 9.
查看 this question 以了解可能的解决方法。不过有点丑。
根据我今天的经验,我发现 Oracle 的 Java VisualVM 显示 cpu 使用率占机器内核总数的百分比,即使被监视的 JVM 在 OS。这是在 "monitor" 选项卡中。
使用 taskset
限制受监控的 jvm(在 linux、Ubuntu 上),当允许该 jvm 的处理器在 htop
中接近 100% 利用率时, VisualVM 中显示的 cpu 百分比显然等于 cpu 的总数除以允许监视的 jvm 的处理器数。因此,秤的分辨率对于这种情况是不够的。
您能否确认您在其他操作系统或一般情况下观察到相同情况?
有没有办法让 VisualVM 在显示 cpu 使用情况时仅考虑关联分配的核心?
根据 VisualVM source code,CPU 使用确实计算为总 CPU 时间除以处理器数量:
long processCpuTime = tracksProcessCpuTime ?
model.getProcessCpuTime() / processorsCount : -1;
其中 processorsCount 是从 OperatingSystemMXBean:
获得的 OperatingSystemMXBean osbean = mxbeans.getOperatingSystemMXBean();
if (osbean != null) processorsCount = osbean.getAvailableProcessors();
存在一个长期存在的 JVM 错误 JDK-6515172,即未考虑进程亲缘关系,即 getAvailableProcessors 始终返回 [=32] 的总数=]s 无论任务集如何。这是 Linux 和 BSD 特有的;在 Solaris 和 Windows.
上正常工作大约一个月前,这个错误终于被解决了。但是,此修复仅适用于 JDK 9.
查看 this question 以了解可能的解决方法。不过有点丑。