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 96b161c..2d57ee7 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 @@ -51,6 +51,12 @@ @Metric("Duration for a update thread run") MutableRate updateThreadRun; + @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"); @@ -82,6 +88,8 @@ private synchronized void setExtended(boolean isExtended) { continuousSchedulingRun.setExtended(isExtended); nodeUpdateCall.setExtended(isExtended); updateThreadRun.setExtended(isExtended); + assignContainerCall.setExtended(isExtended); + completedContainerCall.setExtended(isExtended); INSTANCE.isExtended = isExtended; } @@ -108,4 +116,13 @@ public void addUpdateThreadRunDuration(long value) { public boolean hasUpdateThreadRunChanged() { return updateThreadRun.changed(); } + + public void addCompletedContainerCallDuration(long value) { + completedContainerCall.add(value); + } + + public void addAssignContainerCallDuration(long value) { + assignContainerCall.add(value); + } + } 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 1097f0e..1d813e4 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 @@ -22,6 +22,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import com.google.common.util.concurrent.SettableFuture; +import org.apache.hadoop.util.Time; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.apache.hadoop.classification.InterfaceAudience.LimitedPrivate; @@ -712,6 +713,7 @@ protected void completedContainerInternal( FSSchedulerNode node = getFSSchedulerNode(nodeID); // node could be null if the thread was waiting for the lock and the node // was removed in another thread + long start = Time.monotonicNow(); if (rmContainer.getState() == RMContainerState.RESERVED) { if (node != null) { application.unreserve(rmContainer.getReservedSchedulerKey(), node); @@ -727,6 +729,8 @@ protected void completedContainerInternal( } updateRootQueueMetrics(); } + long end = Time.monotonicNow(); + fsOpDurations.addCompletedContainerCallDuration((end - start)/1000); if (LOG.isDebugEnabled()) { LOG.debug("Application attempt " + application.getApplicationAttemptId() @@ -1086,7 +1090,7 @@ static void assignPreemptedContainers(FSSchedulerNode node) { } @VisibleForTesting - void attemptScheduling(FSSchedulerNode node) { + protected void attemptScheduling(FSSchedulerNode node) { writeLock.lock(); try { if (rmContext.isWorkPreservingRecoveryEnabled() && !rmContext @@ -1126,12 +1130,17 @@ void attemptScheduling(FSSchedulerNode node) { node.getUnallocatedResource(), 0.5f); while (node.getReservedContainer() == null) { + long start = Time.monotonicNow(); Resource assignment = queueMgr.getRootQueue().assignContainer(node); if (assignment.equals(Resources.none())) { LOG.debug("No container is allocated on node {}", node); break; } + if (!CONTAINER_RESERVED.equals(assignment)){ + long end = Time.monotonicNow(); + fsOpDurations.addAssignContainerCallDuration((end - start)/1000); + } assignedContainers++; Resources.addTo(assignedResource, assignment);