问题现象: druid实时任务,消费kafka流量上涨之后druid集群服务器CPU idle只有2-3%可用。导致druid不能对外提供服务,并且实时摄入任务失败。于是,从实时摄入任务入手查看日志。发现gc over limits异常,体现peon进程频繁gc导致任务失败。
初步解决: middlemanager的配置runtime.properties中,druid.indexer.runner.javaOpts=-server -Xms1g -Xmx8g。 因为-Xms1g设置最小堆,如果-Xms设置较小,JVM为了保证系统尽可能在指定内存范围内运行,就会频繁进行GC操作。对系统性能产生影响 于是将druid.indexer.runner.javaOpts修改为-server -Xms4g -Xmx16g.
1、调整前后内存情况对比。 增加jvm监控,从监控看,设置middlemanager最小堆 -Xms是否合理。 调整前,使用内存used接近初始内存init(1G),频发触发GC消耗CPU。调整后预计 -Xms = 3g比较合理(需要比较高峰时段验证) 2、根据qps流量高峰15:00 - 17:00 = 1346815342529 - 1346600303661 = 215038868 2亿条。当前流量1亿条/小时 druid ingest任务配置"taskCount": 40.
相当于每个Peon进程处理 1亿 / 40 = 250万/小时 从Peon内存占用情况250万数据处理过程内存保持再2G以下
结论: 高峰期,每个peon每小时处理2500000条数据。内存占用2G middlemanager的runtime.properties修改配置大于2G,减少gc, -server -Xms4g -Xmx16g配置算合理范围