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);