大家好,又见面了,我是你们的朋友全栈君。
情况,正常运行的服务器,突然tomcat不能访问了
因为服务器的内存是2g的,所以就怀疑是内存不够了,所导致
开始排查
代码语言:javascript复制ps -ef|grep tomcat
显示tomcat已经不在运行了
代码语言:javascript复制free -m
查看内存,当时那台机器free,只有77了,这张图是后在自己电脑上截的
代码语言:javascript复制grep "Out of memory" /var/log/messages
查看系统日志,显示内存不足,杀死了一个java进程,可以推测,就是tomcat惨遭了毒手,
那为什么杀了tomcat呢?
这是由于Linux 内核有个机制叫OOM killer(Out Of Memory killer),,当系统内存不足的时候,out_of_memory()被触发,然后调用select_bad_process()选择一个”bad”进程杀掉。linux选择”bad”进程是通过调用oom_badness(),挑选的算法和想法都很简单很朴实:最bad的那个进程就是那个最占用内存的进程。
对于每个进程都有一个oom_score的属性/proc/PID/oom_score oom- killer 会杀死oom_score较大的进程,当oom_score为0时禁止内核杀死该进程。
代码语言:javascript复制top
可以使用top查看内存状态,可以看到mysql占内存最多,其次是pid=6021的Java程序
代码语言:javascript复制ps -ef|grep 6021
查看到6021是一个java程序
代码语言:javascript复制cat /proc/PID/oom_score
可以看到mysql的oom分数为63,java程序的oom分数为37
如何使内存不足时,不去杀我们重要的业务相关的进程??
/proc/PID/oom_adj,一般来说,oom_adj的值越大,该进程被系统选中终止的可能就越高,当 oom_adj=-17时,oom_score将变为0。(要对某个重要进程进行OOM保护的话,把-17写入到 oom_adj即可)
代码语言:javascript复制echo -17 > /proc/PID/oom_adj
来防止重要的进程被oom_killer杀死。(不推荐,如果是保护进程发生了内存泄漏,而又无法被系统杀死,可能会导致系统崩溃)
推荐优化系统,提高服务器配置
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/163649.html原文链接:https://javaforall.cn