侧边栏壁纸
博主头像
术业有道之编程博主等级

亦是三月纷飞雨,亦是人间惊鸿客。亦是秋霜去叶多,亦是风华正当时。

  • 累计撰写 99 篇文章
  • 累计创建 50 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

记一次linux的灵异操作

Administrator
2020-08-31 / 0 评论 / 0 点赞 / 67 阅读 / 6247 字

最近服务器瞬时流量比较大,经常出现某进程无缘无故被干掉了的情况。

寻找现场:

一、日志:

/var/log/syslog
linux的灵异操作-日志
说的是运行内存不足导致程序运行失败了

二、上阿里云看监控:

linux的灵异操作-阿里云系统监控1
显示服务器几个关键数据直接达到了最大值
linux的灵异操作-阿里云系统监控2
显示网络流入流出非常高

但是从这些监控中根本看不出来是因为什么原因导致的内存不足,实际情况是进程被杀死了。结合服务器业务场景猜测一下。

三、业务场景:

a 程序的流量通过本地端口发到 b 程序,由 b 程序处理。
就是这么简单的一个过程,由于 b 程序的处理效率跟不上 a 程序转发来的数据量,导致数据积压越来越多,堆在 a 程序的运行内存中,直接引发了 a 程序占用内存过多,触发了 liunx OOM_killer

四、liunx 自我保护机制

原因:内存不足唤醒 oom_killer ,挑出 /proc/<pid>/oom_score 最大者并将之 kill 掉。

那么需要找出真正执行的过程是什么

参考文章 https://stackoverflow.com/questions/726690/what-killed-my-process-and-why
说到了 由于outofmemory被kill掉的进程,会在/var/log下的某个文件中留下最终的痕迹

运行

cd /var/log 
dmesg -T | grep -E -i -B100 'killed process' 

linux的灵异操作-dmesg 运行结果

找到了被 kill 的过程

网络途径搜到了以下方式(未验证):

保护进程不被 oom_killer 杀死

  • 选择一个进程保护:
    echo -17 > /proc/<pid>/oom_adj,-17

  • 禁用整个系统的 OOM

sysctl -w vm.panic_on_oom=1 (默认为0,表示开启)

sysctl -p

有些时候 free -m 时还有剩余内存,但还是会触发 OOM-killer,考虑是否 buff/cache 占用过多

附上一个定时脚本清理
buff/cache

echo "0 * * * * root echo 3 > /proc/sys/vm/drop_caches" >> /etc/crontab # 1小时一次 清除页面缓存,目录项和inode
service cron restart

到此一个进程莫名被终结的原因找到了,更加深入的问题,需要研究一下 OOM-killer

个人公众号

0

评论区