背景
本项目有多个定时任务,且部署环境是预发布环境有一台服务器(16.50),生产环境有两台服务器(16.60、16.61),都注册在同一个xxl-job
调度中心。
xxl-job
配置的路由策略都是"轮询"
所以每次执行定时任务时,xxl-job
都是先调度到预发布环境。
问题
之前一直都没有问题,但是05-21日例行查看昨日定时任务的执行情况,发现05-20日00:07:00定时任务[生成拓客本会话]调度成功,但执行时报错:java.lang.OutOfMemoryError: Metaspace
点击查看"执行日志"
分析
然后检查服务器日志,发现该定时任务只打印了start log
,没有打印end log
,但是也没有error log
(说明这个报错是xxl-job
抛出来的?)
然后看了其它的定时任务,全部都是执行成功的(也有执行时间在05-20日00:07:00之后的)。
然后手动再执行一下这个报错的定时任务,还是一样报这个错~
然后手动执行其它的定时任务,还是都执行成功~
解决
将xxl-job
配置的路由策略改为"最后一个",使得调度到生产环境的服务器,再手动执行该定时任务,发现执行成功了!
由此判断是预发布环境的问题,应该是哪个配置值不够大。
后续将问题反馈给运维同事,他给出的答案是这个定时任务用的metaspace比其它定时任务多,超出预发布环境对metaspace的配置了
然后我去预发布和生产服务器分别执行ps aux | grep service-im-statistic
,发现预发布的进程中有配置-XX:MaxMetaspaceSize=128m
,而生产环境没有这个配置,即不限制。