解决OOM-killer导致的tomcat进程丢失

环境:32G内存,16CPU,Centos7

现象:Linux服务器上部署了tomcat+javaweb项目。经常出现tomcat进程丢失的情况,导致业务中断,logs无提示信息。查看系统日志后,发现对应时间点,系统自动kill掉了tomcat进程,如下

 

 解决OOM-killer导致的tomcat进程丢失

解决方案:

1、将tomcat进程临时添加到保护机制

#ps -ef |grep tomcat
#echo -17 > /proc/pid/oom_adj

 

2、调整linux系统的内存分配策略

#vi /proc/sys/vm/overcommit_memory

overcommit_memory=0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
overcommit_memory=1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
overcommit_memory=2, 表示内核允许分配超过所有物理内存和交换空间总和的内存 


3、对tomcat的JVM内存进行控制,修改Xmx和Xms(参考JVM内存的设置规则)

#cd $tomcat_home/bin
#vi catina.sh


4、编写定时监控脚本,若tomcat进程丢失,则自动重启

#!/bin/bash
#2021-02-04
#created by yaohuimo
#
date=$(date +%Y-%m-%d_%H:%M:%S)
##tomcat的进程id
TomcatID=$(ps -ef | grep tomcat | grep java | awk ' { print $2 } ')
##监控脚本日志存放路径
recorddir=/xxx/tool
##监控脚本日志文件名称
recordfile=xxx-monitor.$(date +%Y-%m-%d).log
##tomcat启动文件所在路径
tomcaturl=/xxx/bin

if [ ! -d ${recorddir} ]; then
    mkdir -p ${recorddir}
fi

if [[ $TomcatID ]]; then
    echo "$TomcatID,${date},tomcat服务运行正常!" >>${recorddir}/${recordfile}
else
    sh ${tomcaturl}/startup.sh
    echo "${date},重启了tomcat服务!" >>${recorddir}/${recordfile}
fi

 设置定时任务

#crontab -e

 

备注:上述方法只是临时规避措施,保证业务不长时间中断。本质原因应该是应用的内存占用过高,没有及时释放,建议分析业务接口和代码

 

参考:

https://www.cnblogs.com/leo001/articles/10508295.html
https://blog.csdn.net/weixin_33802505/article/details/91752961


上一篇:内存篇-Linux内存是怎么工作的?


下一篇:OOM导致MySQL服务被kill案例一则