You are viewing a plain text version of this content. The canonical link for it is here.
Posted to yarn-issues@hadoop.apache.org by "Hudson (JIRA)" <ji...@apache.org> on 2014/04/01 01:58:17 UTC
[jira] [Commented] (YARN-1889) In Fair Scheduler, avoid creating
objects on each call to AppSchedulable comparator
[ https://issues.apache.org/jira/browse/YARN-1889?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13955912#comment-13955912 ]
Hudson commented on YARN-1889:
------------------------------
SUCCESS: Integrated in Hadoop-trunk-Commit #5440 (See [https://builds.apache.org/job/Hadoop-trunk-Commit/5440/])
YARN-1889. In Fair Scheduler, avoid creating objects on each call to AppSchedulable comparator (Hong Zhiguo via Sandy Ryza) (sandy: http://svn.apache.org/viewcvs.cgi/?root=Apache-SVN&view=rev&rev=1583491)
* /hadoop/common/trunk/hadoop-yarn-project/CHANGES.txt
* /hadoop/common/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/resource/ResourceWeights.java
* /hadoop/common/trunk/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/scheduler/fair/AppSchedulable.java
* /hadoop/common/trunk/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
> In Fair Scheduler, avoid creating objects on each call to AppSchedulable comparator
> -----------------------------------------------------------------------------------
>
> Key: YARN-1889
> URL: https://issues.apache.org/jira/browse/YARN-1889
> Project: Hadoop YARN
> Issue Type: Improvement
> Components: scheduler
> Reporter: Hong Zhiguo
> Assignee: Hong Zhiguo
> Priority: Minor
> Labels: reviewed
> Fix For: 2.5.0
>
> Attachments: YARN-1889.patch, YARN-1889.patch
>
>
> In fair scheduler, in each scheduling attempt, a full sort is
> performed on List of AppSchedulable, which invokes Comparator.compare
> method many times. Both FairShareComparator and DRFComparator call
> AppSchedulable.getWeights, and AppSchedulable.getPriority.
> A new ResourceWeights object is allocated on each call of getWeights,
> and the same for getPriority. This introduces a lot of pressure to
> GC because these methods are called very very frequently.
> Below test case shows improvement on performance and GC behaviour. The results show that the GC pressure during processing NodeUpdate is recuded half by this patch.
> The code to show the improvement: (Add it to TestFairScheduler.java)
> {code}
> import java.lang.management.GarbageCollectorMXBean;
> import java.lang.management.ManagementFactory;
> public void printGCStats() {
> long totalGarbageCollections = 0;
> long garbageCollectionTime = 0;
> for(GarbageCollectorMXBean gc :
> ManagementFactory.getGarbageCollectorMXBeans()) {
> long count = gc.getCollectionCount();
> if(count >= 0) {
> totalGarbageCollections += count;
> }
> long time = gc.getCollectionTime();
> if(time >= 0) {
> garbageCollectionTime += time;
> }
> }
> System.out.println("Total Garbage Collections: "
> + totalGarbageCollections);
> System.out.println("Total Garbage Collection Time (ms): "
> + garbageCollectionTime);
> }
> @Test
> public void testImpactOnGC() throws Exception {
> scheduler.reinitialize(conf, resourceManager.getRMContext());
> // Add nodes
> int numNode = 10000;
> for (int i = 0; i < numNode; ++i) {
> String host = String.format("192.1.%d.%d", i/256, i%256);
> RMNode node =
> MockNodes.newNodeInfo(1, Resources.createResource(1024 * 64), i, host);
> NodeAddedSchedulerEvent nodeEvent = new NodeAddedSchedulerEvent(node);
> scheduler.handle(nodeEvent);
> assertEquals(1024 * 64 * (i+1), scheduler.getClusterCapacity().getMemory());
> }
> assertEquals(numNode, scheduler.getNumClusterNodes());
> assertEquals(1024 * 64 * numNode, scheduler.getClusterCapacity().getMemory());
> // add apps, each app has 100 containers.
> int minReqSize =
> FairSchedulerConfiguration.DEFAULT_RM_SCHEDULER_INCREMENT_ALLOCATION_MB;
> int numApp = 8000;
> int priority = 1;
> for (int i = 1; i < numApp + 1; ++i) {
> ApplicationAttemptId attemptId = createAppAttemptId(i, 1);
> AppAddedSchedulerEvent appAddedEvent = new AppAddedSchedulerEvent(
> attemptId.getApplicationId(), "queue1", "user1");
> scheduler.handle(appAddedEvent);
> AppAttemptAddedSchedulerEvent attemptAddedEvent =
> new AppAttemptAddedSchedulerEvent(attemptId, false);
> scheduler.handle(attemptAddedEvent);
> createSchedulingRequestExistingApplication(minReqSize * 2, 1, priority, attemptId);
> }
> scheduler.update();
> assertEquals(numApp, scheduler.getQueueManager().getLeafQueue("queue1", true)
> .getRunnableAppSchedulables().size());
> System.out.println("GC stats before NodeUpdate processing:");
> printGCStats();
> int hb_num = 5000;
> long start = System.nanoTime();
> for (int i = 0; i < hb_num; ++i) {
> String host = String.format("192.1.%d.%d", i/256, i%256);
> RMNode node =
> MockNodes.newNodeInfo(1, Resources.createResource(1024 * 64), 5000, host);
> NodeUpdateSchedulerEvent nodeEvent = new NodeUpdateSchedulerEvent(node);
> scheduler.handle(nodeEvent);
> }
> long end = System.nanoTime();
> System.out.printf("processing time for a NodeUpdate in average: %d us\n",
> (end - start)/(hb_num * 1000));
> System.out.println("GC stats after NodeUpdate processing:");
> printGCStats();
> }
> {code}
--
This message was sent by Atlassian JIRA
(v6.2#6252)