线上服务502问题排查---Linux OOM Killer导致的进程消失现象

线上服务502问题排查

文章目录

  • 线上服务502问题排查
    • 问题背景
    • 排查过程
    • 解决方案
    • 复盘总结
    • 知识盘点

问题背景

线上运营平台有两台2C4G的机器组成了集群,其中服务器A上同时还部署了PDF打印等服务,很明显4G内存吃紧,一直担心服务会出现问题,不过运行小半年时间也没遇到,就不再关心此事了。
有天值班时,运营人员反馈:运营平台抽风了,时好时坏,严重影响了他们的工作。
这事儿可不小,得赶紧排查修复啊!

排查过程

  1. 首先在自己的电脑上访问运营平台,正常,未复现,此时13:02了;
  2. 呼朋唤友,同事们也各自访问运营平台,5人中,只有老大的电脑访问时,页面显示502;
  3. 于是猜测线上两台机器中有一台出现了问题(具体问题还未知),Nginx没有将该机器剔除路由列表,有些ip的请求被路由到该机器上了;
  4. 分别查看两天机器的日志查看是什么问题导致请求失败,发现机器A的日志停留在12:00,其中没有任何相关的错误信息;
  5. ps -ef|grep xxx命令查看项目进程,发现进程已经消失;

解决方案

  1. 重启进程,恢复服务;
  2. 编写检测脚本,自动检测项目进程,如果进程消失则自动重启。

复盘总结

  1. 线上服务进程为什么会莫名其妙地消失?(见下方知识盘点)
  2. 反向代理服务器配置心跳检测(或健康检查)机制,自动剔除路由表中的非正常机器。

知识盘点

  1. Linux 内核有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽而内核会把该进程杀掉;
  2. OOM(out-of-memory) killer是通过/proc/$PID/oom_score这个值来决定哪个进程被干掉的。这个值是系统综合进程的内存消耗量、CPU时间(utime + stime)、存活时间(uptime - start time)和oom_adj计算出的,消耗内存越多分越高,存活时间越长分越低;总的策略是:损失最少的工作,释放最大的内存同时不伤及无辜的用了很大内存的进程,并且杀掉的进程数尽量少;
  3. 查看Linux系统的Java进程相关的信息,执行dmesg | grep java命令:

    说明Java进程27372由于得分最高,被OOM_Killer机制给杀掉了;
  4. sudo less /var/log/messages | grep oom-killer命令查看更多相关信息;
  5. 防止重要的进程被Linux杀掉:
  • 保护某个进程不被内核杀掉可以这样操作:echo -17 > /proc/$PID/oom_adj,其中-17表示禁止killer;
  • 通过修改内核参数禁止OOM机制:vm.panic_on_oom = 1

参考:

  1. 消失的Java进程-Linux OOM Killer
  2. Linux – 内存控制之oom killer机制及代码分析
  3. Out of memory: Kill process 问题

你可能感兴趣的:(踩坑记录)