linux内存不足导致tomcat宕机

linux内存不足导致tomcat宕机情况,正常运行的服务器,突然tomcat不能访问了因为服务器的内存是2g的,所以就怀疑是内存不够了,所导致开始排查ps-ef|greptomcat[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TTLyQ5EC-1585835537446)(E:\Workspaces\Markdown\linux\记一次内存不够的情况.assets\image-…

大家好,又见面了,我是你们的朋友全栈君。

  • 情况,正常运行的服务器,突然tomcat不能访问了

    因为服务器的内存是2g的,所以就怀疑是内存不够了,所导致

    开始排查

    1. ps -ef|grep tomcat
      

      在这里插入图片描述

      显示tomcat已经不在运行了

    2. free -m
      

      在这里插入图片描述

      查看内存,当时那台机器free,只有77了,这张图是后在自己电脑上截的

    3. grep "Out of memory" /var/log/messages
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dNOQtk9c-1585835537447)(E:\Workspaces\Markdown\linux\记一次内存不够的情况.assets\image-20200401112058171.png)]

      在这里插入图片描述

      查看系统日志,显示内存不足,杀死了一个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时禁止内核杀死该进程。

    1. top
      

      在这里插入图片描述

      可以使用top查看内存状态,可以看到mysql占内存最多,其次是pid=6021的Java程序

    2. ps -ef|grep 6021
      

      在这里插入图片描述

      查看到6021是一个java程序

    3. 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即可)

    • echo -17 > /proc/PID/oom_adj
      

      来防止重要的进程被oom_killer杀死。(不推荐,如果是保护进程发生了内存泄漏,而又无法被系统杀死,可能会导致系统崩溃)

    • 推荐优化系统,提高服务器配置

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163649.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月23日 上午6:00
下一篇 2022年7月23日 上午6:00


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号