Tomcat和mysql明明启动了,过一会之后会直接自己杀掉进程,自己取消掉

博客讲述了在服务器部署时遇到Tomcat和MySQL进程被自动结束的问题,经过排查发现是Linux OOM Killer在内存不足时为了释放内存而杀死进程。尝试通过设置oom_adj免疫进程未成功,最终通过增加swap交换内存解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

服务器部署遇到的奇奇怪怪问题:Tomcat和mysql明明启动了,过一会之后会直接自己杀掉进程,自己取消掉

问题解决:

  • 查了springboot项目的日志,没有任何异常信息报错,直接springboot启动到连接数据库的时候,直接停止启动了,这时候ps -ef | grep mysql,mysql进程没了…,cd /usr/local/mysq/data查看mysql的日志,mysql中也没有任何报错信息…

  • 找了整整三天,包括重装Tomcat,重装mysql,还是存在这个问题…

  • 突然在百度时候,看到知乎大佬所说的,

应用部署在线下服务器上,线下服务器,相对来说配置低一些,同时可能和其它的服务部署在一起。后来遇到一个比较怪异的问题:
应用跑一段时间,Tomcat进程就挂掉了。
而且这个没有什么规律,不是在特定操作执行时,或者特定时间出现。同时没有任何的日志。本来以为是其它的服务的人把我们的不小心kill掉了,但kill的有点太频繁了,同时和QA同学了解到,在线下服务器上的其他服务,目前都没有操作过,排除了人为的可能。
剩下的就只能从应用自身的问题入手了。但整个进程挂掉的时候,并没有任何日志生成,同时也没有生成Crash文件。还尝试在启动脚本中增加
-XX:+HeapDumpOnOutOfMemoryError,想要分析下堆内数据,进程退出时也是什么都没生成。
这时就只能请教万能的网络了,Google之后了解到一个Linux OOM Killer。按照这个思路和提供的方式去查看了服务器的日志,果然问题在这儿。
Linux OOM Killer
在这里有一个关于OOM Killer的描述
It is the job of the linux ‘oom killer’ to sacrifice one or more processes in order to free up memory for the system when all else fails. It will also kill any process sharing the same mm_struct as the selected process, for obvious reasons. Any particular process leader may be immunized against the oom killer if the value of its /proc//oomadj is set to the constant OOM_DISABLE (currently defined as -17).
长话短说就是,Linux Kernel的这个Killer,会在内存不足的时候kill掉任何不受保护的进程,从而释放内存,保证Kernel的运行。
要让自己的进程成为一个受保护的进程,请注意这一句:
Any particular process leader may be immunized against the oom killer if the value of its /proc//oomadj is set to the constant OOM_DISABLE (currently defined as -17).
操作方式上可以使用
echo -17 > /proc/$PID/oom_adj
更多可以参考这个网页(OOM Killer - How To Create OOM Exclusions in Linux - Backdrift)
,写一个定时任务,执行脚本,把当前进程的Pid加到这个oomadj里。
那怎么判断进程是不是被OOM Killer给干掉了呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值