diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSOpDurations.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSOpDurations.java index 20d2af9..fce4e59 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSOpDurations.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FSOpDurations.java @@ -56,6 +56,12 @@ @Metric("Duration for a preempt call") MutableRate preemptCall; + @Metric("Duration for an assign container call") + MutableRate assignContainerCall; + + @Metric("Duration for a completed container call") + MutableRate completedContainerCall; + private static final MetricsInfo RECORD_INFO = info("FSOpDurations", "Durations of FairScheduler calls or thread-runs"); @@ -89,6 +95,8 @@ private synchronized void setExtended(boolean isExtended) { updateThreadRun.setExtended(isExtended); updateCall.setExtended(isExtended); preemptCall.setExtended(isExtended); + assignContainerCall.setExtended(isExtended); + completedContainerCall.setExtended(isExtended); INSTANCE.isExtended = isExtended; } @@ -118,6 +126,14 @@ public void addPreemptCallDuration(long value) { preemptCall.add(value); } + public void addCompletedContainerCallDuration(long value) { + completedContainerCall.add(value); + } + + public void addAssignContainerCallDuration(long value) { + assignContainerCall.add(value); + } + @VisibleForTesting public boolean hasUpdateThreadRunChanged() { return updateThreadRun.changed(); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java index 94fdb7c..fd682c3 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/FairScheduler.java @@ -35,6 +35,7 @@ import org.apache.hadoop.classification.InterfaceStability.Unstable; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.security.UserGroupInformation; +import org.apache.hadoop.util.Time; import org.apache.hadoop.yarn.api.records.ApplicationAttemptId; import org.apache.hadoop.yarn.api.records.ApplicationId; import org.apache.hadoop.yarn.api.records.Container; @@ -879,6 +880,7 @@ protected void completedContainerInternal( // Get the node on which the container was allocated FSSchedulerNode node = getFSSchedulerNode(container.getNodeId()); + long start = Time.monotonicNow(); if (rmContainer.getState() == RMContainerState.RESERVED) { application.unreserve(rmContainer.getReservedSchedulerKey(), node); @@ -887,6 +889,8 @@ protected void completedContainerInternal( node.releaseContainer(container); updateRootQueueMetrics(); } + long end = Time.monotonicNow(); + fsOpDurations.addCompletedContainerCallDuration((end - start)/1000); if (LOG.isDebugEnabled()) { LOG.debug("Application attempt " + application.getApplicationAttemptId() @@ -1148,8 +1152,13 @@ void attemptScheduling(FSSchedulerNode node) { node.getUnallocatedResource(), 0.5f); while (node.getReservedContainer() == null) { boolean assignedContainer = false; + long start = Time.monotonicNow(); Resource assignment = queueMgr.getRootQueue().assignContainer(node); if (!assignment.equals(Resources.none())) { + if (!CONTAINER_RESERVED.equals(assignment)){ + long end = Time.monotonicNow(); + fsOpDurations.addAssignContainerCallDuration((end - start)/1000); + } assignedContainers++; assignedContainer = true; Resources.addTo(assignedResource, assignment);