记一次系统OOM导致weblogic异常退出的排查过程

hcwei 2020年06月10日 319次浏览

情景描述

云服务器上weblogic毫无征兆的突然宕机,weblogic中启动的服务全部停止。

排查思路

因为是整个weblogic退出,所以第一想到的也是内存溢出导致。首先查看了weblogic日志,但是由于weblogic进程直接被杀掉,导致weblogic日志并没有记录任何异常。然后开始查看系统日志寻找问题原因/var/log/messages,发现系统日志中有许多Out of memory: Kill process XXX的日志,验证了是内存溢出导致的异常退出。
image.png

原因解析

根据对系统日志的分析,确认weblogic退出并非weblogic本身的问题,而是整个系统内存不足,导致触发了oom killer。

oom killer介绍:

要理解oom_killer,首先需要理解linux系统overcommit特性。linux出于系统优化考虑,允许程序申请比系统可用内存更多的内存,由于不是所有的程序申请了内存就立刻使用,当需要使用的时候系统可能已经回收了一些资源了。这种特性叫做overcommit。因为这个特性,就会出现系统资源回收不及时导致out-of-memory问题。
linux下有3种overcommit的策略,可以在/proc/sys/vm/overcommit_memory配置。取0,1和2三个值,默认是0。

  • 0:启发式策略
    比较严重的overcommit将不能得逞,root用户能overcommit的值比普通用户稍多。
  • 1:永远允许overcommit
    这种策略适合那些不能承受内存分配失败的应用,比如某些科学计算应用。
  • 2:永远禁止overcommit
    在这个情况下,系统所能分配的内存不会超过swap+RAM*系数(/proc/sys/vm/overcommit_ratio,默认50%,可以调整),如果这些资源全部用光,那么后面任何尝试申请内存的行为都会返回错误,这意味着此时没法运行任何新程序。

由于overcommit可以申请的内存超过实际物理内存,当实际使用的内存超过实际物理内存时,linux即会启动oom killer,挑选进程杀死,释放内存,来解决内存不足的问题;oom killer是通过/proc/pid/oom_score这个值来决定哪个进程被干掉的。这个值是系统综合进程的内存消耗量、CPU时间(utime + stime)、存活时间(uptime - start time)和oom_adj计算出的,消耗内存越多分越高,存活时间越长分越低。

日志分析

image.png

参考文章:https://blog.csdn.net/sbjiesbjie/article/details/52624467