web服務部署在阿里雲上,mongodb是一個三副本的主從節點,有一個定時任務每天晚上運行,主要是通過aggregate統計分析每個使用者的操作行為。運行一段時候,隨著使用者的增長,發現統計分析處理原來越慢,每天需要12個以上的小時,而且CPU佔用率長期高達90%。通過慢查詢記錄發現不停的在建立刪除一些表,然後不停的主從同步,時間明顯特別長。查JAVA代碼發現調用的是aggregate out,該方法會把aggregate的結果覆蓋輸出到暫存資料表,所以會不停的建立刪除表。將out改為aggregate就好了。改完之後30分鐘就可以跑完定時任務,CPU佔用率下降到60%
修改前代碼
Iterator<RecordStatistics> aggregate = getDs().createAggregation(LearningRecord.class) .match(query) .group("userId", grouping("avgScore", new Accumulator("$avg","score")), grouping("avgTime", new Accumulator("$avg","learnTime")), grouping("count", new Accumulator("$sum",1)), grouping("totalTime", new Accumulator("$sum","learnTime")) ) .out(RecordStatistics.class);
修改後代碼
Iterator<RecordStatistics> aggregate = getDs().createAggregation(LearningRecord.class) .match(query) .group("userId", grouping("avgScore", new Accumulator("$avg","score")), grouping("avgTime", new Accumulator("$avg","learnTime")), grouping("count", new Accumulator("$sum",1)), grouping("totalTime", new Accumulator("$sum","learnTime")) ) .aggregate(RecordStatistics.class);