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 以了解可能的解决方法。不过有点丑。