Java VisualVM CPU 使用率和处理器亲和性

Posted

技术标签:

【中文标题】Java VisualVM CPU 使用率和处理器亲和性【英文标题】:Java VisualVM CPU usage and processor affinity 【发布时间】:2016-03-04 17:14:00 【问题描述】:

根据我今天的经验,我发现 Oracle 的 Java VisualVM 将 cpu 使用率显示为总机器内核数的百分比,即使被监控的 JVM 在操作系统中设置了有限的进程关联。这是在“监视器”选项卡中。

taskset限制被监控的jvm(在linux,Ubuntu上),当htop中允许该jvm的处理器利用率接近100%时,VisualVM中显示的cpu百分比显然等于cpu的总数除以被监控的 jvm 允许的处理器数量。因此,在这种情况下,比例尺的分辨率是不够的。

您能否确认您在其他操作系统或一般情况下观察到相同的情况?

在显示 cpu 使用情况时,有没有办法让 VisualVM 仅对关联分配的核心进行说明?

【问题讨论】:

【参考方案1】:

根据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 总是返回 CPU 的总数,而不管任务集如何。这是特定于 Linux 和 BSD 的;在 Solaris 和 Windows 上正常工作。

大约一个月前,这个错误终于得到解决。但是,该修复仅适用于 JDK 9。

查看this question 了解可能的解决方法。不过它们有点丑。

【讨论】:

以上是关于Java VisualVM CPU 使用率和处理器亲和性的主要内容,如果未能解决你的问题,请参考以下文章

远程启动 Java CPU Profiler,如 VisualVM,但自动化

Java Visual VM 倾斜 CPU

Java VisualVM 中的“总时间(CPU)”是不是包含 CPU 用于执行其他进程的时间?

Java性能监控工具:VisualVM

VisualVM 未显示任何调用 CPU 性能分析的方法

VisualVM、Scala 和 Ubuntu?