业务生产启动时,20个节点有1-2个节点因为jvm问题出现启动失败,k8s自动重启后正常。在测试环境2个节点下偶现
排查思路:
- 先拿到hs_err_pid的jvm错误文件
- 找到当前线程和内部错误信息
hs_err_pid 文件分析
当前线程:lettuce的线程
线程堆栈
Internal exceptions :
从信息中就可以看出,导致这次jvm异常的是lettuce线程的一个jfr相关的操作。然后我们就可以去看lettuce 的官网和github有么有关于这个jfr的错误信息的记录,还可以看jdk关于这个这个jfr的错误issue,因为最后报错是jdk的报错
lettcue和jdk 官网资料排查
lettcue在6.1以上版本才开启了jfr事件流
jdk 官方解释:
The class transformation of custom JFR events does not seem to be thread save. If multiple threads are loading the same custom JFR event class, eg. because the classloader is parallel capable, then this results in a JVM crash.
结论
lettuce在6.1以上版本开启了jdk的一个jfr事件流上报监控的功能,这个jfr的功能和agent 字节码增强的transformation 操作在并行环境下有冲突,所以就解释了为啥20个节点的时候是必现,然后jvm异常后重启又正常了。
解决方案:
io.lettuce.core.jfr=false 禁用jfr功能
参考:
jdk jfr bug: https://bugs.openjdk.org/browse/JDK-8249009
lettuce jfr: https://github.com/lettuce-io/lettuce-core/wiki/Connection-Events