问题: worker 节点OOM,跟zookeeper 的heartbeat 超时,导致集群出现任务容错;
原因:OOM是因为目前的worker的 shell task 日志打印机制导致, 内存中logBuffer撑满了内存。
详细OOM过程:
一个线程负责把process的日志往logBuffer 中写,另外一个线程会读取并清理logBuffer。
但是buffer使用的Collections.synchronizedList(new ArrayList<>()); 存在并发隐患,可能导致读取的线程挂掉。
这种情况下就会出现logBuffer无限膨胀,从而oom。
另外需要提的一个点就是,之所以今天爆发这个问题,因为新搞的一个功能会大量的打印日志。
关键类及文件:
- org.apache.dolphinscheduler.server.worker.task.AbstractCommandExecutor
- logback-worker.xml
处理方式:
改arraylist 为: CopyOnWriteArrayList