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,但自动化