最近Jenkins每隔两三天就会出现一次502,好几次都在关键发布的时候挂了,很痛苦。每次都需要重启Jenkins才能恢复
今天有时间研究502的问题。
首先排查主节点和从节点的Jenkins日志,看不出任何异常,甚至连报错都没有,无语
随后检查了内核的message日志。
依据上次Jenkins出现502的时间节点,在message日志里看到了这个
第一个红框可以很明显看到,48分26秒的时候,内存溢出,内核的OOM killer机制将Jenkins的主进程杀死了。
正当纳闷为什么Jenkins会出现内存溢出问题的时候,看到了第二个红框的内容,第二红框是我重启Jenkins后的内核报错,大意是MaxPermSize=1024m这个启动参数被忽略了。因为这个配置在java8中不再支持。
于是乎我检查了一番Jenkins的启动配置参数,看到前任运维写了这个配置
JENKINS_JAVA_OPTIONS="-Xmx4g -Xms4g -XX:+UseConcMarkSweepGC -XX:MaxPermSize=1024m -Djava.awt.headless=true"
果然有MaxPermSize=1024m这个配置,果断将其修改为了java8的配置参数
JENKINS_JAVA_OPTIONS="-Xmx3g -Xms3g -XX:+UseConcMarkSweepGC -XX:MetaspaceSize=1024m -XX:MaxMetaspaceSize=3000m -Djava.awt.headless=true"
随后重启Jenkins,在message日志中没有再看到过第二个红框的报错了
后面再观察几天,如果没有出现502的。说明问题解决了。
总结:前任运维老哥错误的配置了MaxPermSize=1024m这个启动参数,实际启动过程中并没有生效,所以Jenkins在使用过程中不会触发GC回收,内存占用也就会越来越高,直到被OOM给kill掉。
也算是前任留的一个暗坑吧。