diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/WindowsBasedProcessTree.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/WindowsBasedProcessTree.java index 7d9c7d3..7b744b7 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/WindowsBasedProcessTree.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/WindowsBasedProcessTree.java @@ -19,6 +19,7 @@ package org.apache.hadoop.yarn.util; import java.io.IOException; +import java.math.BigInteger; import java.util.HashMap; import java.util.Map; @@ -48,6 +49,9 @@ private long cpuTimeMs = UNAVAILABLE; private Map processTree = new HashMap(); + + private final CpuTimeTracker cpuTimeTracker; + private Clock clock; public static boolean isAvailable() { if (Shell.WINDOWS) { @@ -70,7 +74,10 @@ public static boolean isAvailable() { public WindowsBasedProcessTree(String pid) { super(pid); - taskProcessId = pid; + this.taskProcessId = pid; + this.clock = new SystemClock(); + // Instead of jiffies, Windows uses milliseconds directly; 1ms = 1 jiffy + this.cpuTimeTracker = new CpuTimeTracker(1L); } // helper method to override while testing @@ -209,7 +216,7 @@ public long getRssMemorySize(int olderThanAge) { } return total; } - + @Override @SuppressWarnings("deprecation") public long getCumulativeRssmem(int olderThanAge) { @@ -227,9 +234,22 @@ public long getCumulativeCpuTime() { return cpuTimeMs; } + private BigInteger getTotalProcessMs() { + long totalMs = 0; + for (ProcessInfo p : processTree.values()) { + if (p != null) { + totalMs += p.cpuTimeMs; + } + } + return BigInteger.valueOf(totalMs); + } + @Override public float getCpuUsagePercent() { - return CpuTimeTracker.UNAVAILABLE; + BigInteger processTotalMs = getTotalProcessMs(); + cpuTimeTracker.updateElapsedJiffies(processTotalMs, clock.getTime()); + + return cpuTimeTracker.getCpuTrackerUsagePercent(); } }