记一次flinkcdc任务一段时间后cpu占用100的解决过程

midoll 556 2023-03-17

现象:

仿真环境flink集群中,flinkcdc任务同步不了数据

排查过程

一:

查看flinkcdc任务所在机器,发现cpu占用居高不下。先启动同步任务,cpu占用不高,开启join任务后,cpu拉满。

二:

减少同步任务,减少join任务,多次尝试,问题仍然存在

三:

用jstack工具查看线程栈信息,发现占用资源的线程为logmainer同步Oracle归档日志的线程。

四:

分析所在的代码信息,判断logmainer维护的事务的缓冲区(recentlyCommittedTransactionIds)太大,循环里一直占用资源;

五:

多次修改debezium中间件的相关优化参数后(lob.enable参数没有影响),cpu资源占用问题消失,flink作业正常执行(同一台taskmanager跑了5个cdc同步任务和16个join任务)。
以下为关键参数配置:

properties.setProperty("log.mining.transaction.retention.hours", "1");
properties.setProperty("heartbeat.interval.ms", "60000");
properties.setProperty("log.mining.batch.size.default", "100000");
properties.setProperty("log.mining.batch.size.min", "10000");
properties.setProperty("log.mining.batch.size.max", "1000000");
properties.setProperty("log.mining.sleep.time.min.ms", "1000");
properties.setProperty("log.mining.sleep.time.max.ms", "60000");
properties.setProperty("log.mining.sleep.time.default.ms", "3000");
properties.setProperty("log.mining.sleep.time.increment.ms", "1000");

所用的一些关键命令

查看Java进程:jps
监控java进程(线程占用资源):top -p [pid] -H
栈信息快照:jstack [pid] > stack.log
快照里查线程状态:cat -n stack.log | grep [16进制的线程id] -C10


# flink # flinkcdc