马上要开始第二阶段优化了,赶快把第一阶段优化内容及结果贴下。
优化一:避免频繁调用加锁方法
•500次连续jstack结果分析
-- tip.shouldClose 155 99.3%
-- tip.isComplete 155 100%
优化前,TIP::isComplete()方法占总CPU时间达36%:
优化后:已经在图中消失,即比例非常小。
优化二:避免比较JobID
优化前,TIP::shouldClose()方法占到了总CPU时间的19%
优化后只有1%了:
优化三:降低JT::getTasksToKill()方法的时间复杂度
优化后,心跳已经不占主要操作:
顺便说下优化三是非常给力的,举个例子:
一个1w个map+5k个reduce的作业,当执行reduce时,map全部处于完成状态。这段时间每次心跳都要遍历这1w的map;
而tasktracker上running tasks的个数的最大值是个常数,也就是slots的配置。
因此这个改动是可以理解为复杂度降低了一个数量级。
优化四:降低Scheduler::updateTaskCounts()时间复杂度
优化总结
•根本原因:
本次优化的最大成果是,在2000台集群上成功启动了TaskTracker的oob心跳。