Skip to content

Commit 644cfe3

Browse files
committed
GH-235 use ProcessCpuTimeByNS if it is available; usage of ProcessingCapacity fixed
1 parent cf53dcb commit 644cfe3

File tree

2 files changed

+46
-13
lines changed
  • visualvm
    • jvm/src/org/graalvm/visualvm/jvm
    • libs.profiler/lib.profiler/src-jdk15/org/graalvm/visualvm/lib/jfluid/server/system

2 files changed

+46
-13
lines changed

visualvm/jvm/src/org/graalvm/visualvm/jvm/JmxSupport.java

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,17 @@
6161
public class JmxSupport implements DataRemovedListener {
6262
private final static Logger LOGGER = Logger.getLogger(JmxSupport.class.getName());
6363
private static final String PROCESS_CPU_TIME_ATTR = "ProcessCpuTime"; // NOI18N
64+
65+
/** IBM/OpenJ9 only. */
66+
private static final String PROCESS_CPU_TIME_NS_ATTR = "ProcessCpuTimeByNS"; // NOI18N
67+
68+
/**
69+
* IBM/OpenJ9 only.
70+
* Returns the collective processing capacity available to the VM
71+
* in units of 1% of a physical processor. In environments without
72+
* some kind of virtual partitioning, this will simply be the number
73+
* of CPUs * 100.
74+
*/
6475
private static final String PROCESSING_CAPACITY_ATTR = "ProcessingCapacity"; // NOI18N
6576
private static final String PERM_GEN = "Perm Gen"; // NOI18N
6677
private static final String PS_PERM_GEN = "PS Perm Gen"; // NOI18N
@@ -76,11 +87,12 @@ public class JmxSupport implements DataRemovedListener {
7687
private JVMImpl jvm;
7788
private Object processCPUTimeAttributeLock = new Object();
7889
private Boolean processCPUTimeAttribute;
79-
private long processCPUTimeMultiplier;
90+
private double processingCapacity;
8091
private Timer timer;
8192
private MemoryPoolMXBean permGenPool;
8293
private Collection<GarbageCollectorMXBean> gcList;
8394
private String[] genName;
95+
private String processCpuTimeAttr;
8496

8597
JmxSupport(Application app, JVMImpl vm) {
8698
jvm = vm;
@@ -112,15 +124,20 @@ boolean hasProcessCPUTimeAttribute() {
112124
MBeanInfo info = conn.getMBeanInfo(osName);
113125
MBeanAttributeInfo[] attrs = info.getAttributes();
114126

115-
processCPUTimeMultiplier = 1;
127+
processingCapacity = 1;
116128
for (MBeanAttributeInfo attr : attrs) {
117129
String name = attr.getName();
118-
if (PROCESS_CPU_TIME_ATTR.equals(name)) {
130+
if (PROCESS_CPU_TIME_ATTR.equals(name) && !processCPUTimeAttribute) {
131+
processCPUTimeAttribute = Boolean.TRUE;
132+
processCpuTimeAttr = name;
133+
}
134+
if (PROCESS_CPU_TIME_NS_ATTR.equals(name)) {
119135
processCPUTimeAttribute = Boolean.TRUE;
136+
processCpuTimeAttr = name;
120137
}
121138
if (PROCESSING_CAPACITY_ATTR.equals(name)) {
122139
Number mul = (Number) conn.getAttribute(osName,PROCESSING_CAPACITY_ATTR);
123-
processCPUTimeMultiplier = mul.longValue();
140+
processingCapacity = mul.longValue()/100.0/getAvailableProcessors();
124141
}
125142
}
126143
} catch (Exception ex) {
@@ -143,9 +160,9 @@ long getProcessCPUTime() {
143160

144161
if (conn != null) {
145162
try {
146-
Long cputime = (Long)conn.getAttribute(osName,PROCESS_CPU_TIME_ATTR);
163+
Long cputime = (Long)conn.getAttribute(osName,processCpuTimeAttr);
147164

148-
return cputime.longValue()*processCPUTimeMultiplier;
165+
return (long)(cputime.longValue()/processingCapacity);
149166
} catch (Exception ex) {
150167
LOGGER.throwing(JmxSupport.class.getName(), "hasProcessCPUTimeAttribute", ex); // NOI18N
151168
}

visualvm/libs.profiler/lib.profiler/src-jdk15/org/graalvm/visualvm/lib/jfluid/server/system/Timers.java

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,24 @@ public class Timers {
6262

6363
private static MBeanServerConnection conn;
6464
private static final String PROCESS_CPU_TIME_ATTR = "ProcessCpuTime"; // NOI18N
65+
66+
/** IBM/OpenJ9 only. */
67+
private static final String PROCESS_CPU_TIME_NS_ATTR = "ProcessCpuTimeByNS"; // NOI18N
68+
69+
/**
70+
* IBM/OpenJ9 only.
71+
* Returns the collective processing capacity available to the VM
72+
* in units of 1% of a physical processor. In environments without
73+
* some kind of virtual partitioning, this will simply be the number
74+
* of CPUs * 100.
75+
*/
6576
private static final String PROCESSING_CAPACITY_ATTR = "ProcessingCapacity"; // NOI18N
6677
private static ObjectName osName;
67-
private static long processCPUTimeMultiplier;
78+
private static double processingCapacity;
6879
private static int processorsCount;
6980
private static boolean processCPUTimeAttribute;
7081
private static boolean initialized;
82+
private static String processCpuTimeAttr;
7183

7284
//~ Methods ------------------------------------------------------------------------------------------------------------------
7385

@@ -99,9 +111,9 @@ public static long getProcessCpuTime() {
99111
initializeProcessCPUTime();
100112
if (processCPUTimeAttribute) {
101113
try {
102-
Long cputime = (Long)conn.getAttribute(osName,PROCESS_CPU_TIME_ATTR);
114+
Long cputime = (Long)conn.getAttribute(osName,processCpuTimeAttr);
103115

104-
return (cputime.longValue()*processCPUTimeMultiplier)/processorsCount;
116+
return (long)(cputime.longValue()/processingCapacity/processorsCount);
105117
} catch (Exception ex) {
106118
ex.printStackTrace();
107119
}
@@ -135,17 +147,21 @@ private static void initializeProcessCPUTime() {
135147
conn = ManagementFactory.getPlatformMBeanServer();
136148
osName = new ObjectName(ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME);
137149
attrs = conn.getMBeanInfo(osName).getAttributes();
138-
processCPUTimeMultiplier = 1;
139150
processorsCount = ManagementFactory.getOperatingSystemMXBean().getAvailableProcessors();
140151
for (int i = 0; i < attrs.length; i++) {
141152
String name = attrs[i].getName();
142153

143-
if (PROCESS_CPU_TIME_ATTR.equals(name)) {
144-
processCPUTimeAttribute = true;
154+
if (PROCESS_CPU_TIME_ATTR.equals(name) && !processCPUTimeAttribute) {
155+
processCPUTimeAttribute = Boolean.TRUE;
156+
processCpuTimeAttr = name;
157+
}
158+
if (PROCESS_CPU_TIME_NS_ATTR.equals(name)) {
159+
processCPUTimeAttribute = Boolean.TRUE;
160+
processCpuTimeAttr = name;
145161
}
146162
if (PROCESSING_CAPACITY_ATTR.equals(name)) {
147163
Number mul = (Number) conn.getAttribute(osName,PROCESSING_CAPACITY_ATTR);
148-
processCPUTimeMultiplier = mul.longValue();
164+
processingCapacity = mul.longValue()/100.0/processorsCount;
149165
}
150166
}
151167
} catch (JMRuntimeException ex) {

0 commit comments

Comments
 (0)