环境:32G内存,16CPU,Centos7
现象:Linux服务器上部署了tomcat+javaweb项目。经常出现tomcat进程丢失的情况,导致业务中断,logs无提示信息。查看系统日志后,发现对应时间点,系统自动kill掉了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