任务通信超时排查
本文介绍数据同步任务在资源紧张的情况下,任务通信超时问题排查。
问题现象
任务产生延迟,同时伴随着日志中出现通信超时,日志中异常信息如下。
2022-11-01 09:39:06.844 [heartbeat-report-4-thd-0] ERROR rsocket - fetch rsocket async result timeout. current timeout: 10000 ms. route name:taskReceiveHeartBeat, request id:f15d010e-5985-11ed-9b1c-09d7a8ea0743
java.util.concurrent.TimeoutException: Waited 10000 milliseconds for com.google.common.util.concurrent.SettableFuture@5bc61885[status=PENDING]
at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:470)
at com.google.common.util.concurrent.AbstractFuture$TrustedFuture.get(AbstractFuture.java:92)
at com.clougence.cloudcanal.task.rsocket.impl.TaskRSocketServiceImpl.getAsyncResult(TaskRSocketServiceImpl.java:95)
at com.clougence.cloudcanal.task.rsocket.impl.TaskRSocketServiceImpl.requestNonBlock(TaskRSocketServiceImpl.java:71)
at com.clougence.cloudcanal.base.service.task.thread.AliveHeartbeatReportThread.run(AliveHeartbeatReportThread.java:61)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
问题排查
问题确认
- 进入控制台页面,选择任务详情>更多(监控图表页),如下图所示。
- 选择任务资源监控>任务JVM GC数,如下图所示,如图表曲线上观察到 FGC 数量不为0,说明内存资源紧张。
问题原因
同步任务使用较小规格,或者单条数据过大、参数设置不当导致任务内存 FGC 增多,从而影响任务对外通信。
解决方案
可通过调整任务规格或优化参数处理。
调整任务规格
- 如下图所示,打开任务详情-功能列表-参数修改,搜索参数specId,选择更大的规格。
优化任务参数
- 进入控制台,选择任务详情>功能列表>参数修改。
- 增量阶段参数调整 increRingBufferSize、increBatchSize参数,将原有值调小,避免一次性同步太多数据。
- 全量阶段参数调整 fullRingBufferSize、fullBatchSize参数,将原有值调小,避免一次性同步太多数据。
- 如果上述步骤无法自助解决问题,请加群提问,请描述问题背景并提供报错日志或截图。