【bug】-k8s容器中的Java进程经常自动被杀
故事背景
主角:低代码项目
时间:2023-08-29
背景:项目通过jenkins部署k8s容器到虚拟机,在一次部署之后,服务发生无限重启的现象,springboot项目起来后没多久(甚至有几次还没启动)就会被杀掉进程,服务宕机了一个晚上。
排查过程
查看日志
通过 kubelet logs 命令查看服务运行日志,未发现任何报错,只看到日志输出到一半就停止了输出,发现服务进入CrashBackOff,随后重启,无法定位问题。
本地调试
本地启动服务的同时,通过JProfile监控Java进程的CPU和内存使用情况,发现CPU稳定在20%左右,内存使用稳定在1~2GB,而k8s给pod分配的cpu核数是4,JVM配置的-Xms为2048m,-Xmx为4096m,排除内存泄漏和CPU过高。
查询资料
由于我没有服务器root权限,没法查看syslog,只能上网寻求答案。
看到这段话,我赶紧去检查了一下k8s对资源的限制,果然发现了问题!
问题果然出在这里:k8s限制了内存资源为4G,同时JVM配置的-Xmx也是4G,-Xmx限制的只是Java堆的最大内存,还有栈、永生代、JVM本身、NIO中的DirectBuffer等资源会占用运行内存,导致容器中实际使用的内存超过了资源限制的阈值,进程被杀死。
解决方法
修改JVM参数-Xmx为2048m,重启服务后,正常运行。参考资料
- https://blog.csdn.net/u012516914/article/details/109108660
- http://runxinzhi.com/lujiango-p-14933452.html