馬上要開始第二階段優化了,趕快把第一階段優化內容及結果貼下。
優化一:避免頻繁調用加鎖方法
•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心跳。