社区编辑申请
注册/登录
还在担心服务器进程被OOM?只需一招,即可避免
运维 服务器运维
如何防止重要的系统进程触发(OOM)机制而被杀死呢?只需要一招,就可以轻松避免。

问题描述

Linux 内核有个机制叫 OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽而内核会把该进程杀掉。

典型的情况是:某天一台机器突然 ssh 远程登录不了,但能 ping 通,说明不是网络的故障,原因是 sshd 进程被 OOM killer 杀掉了(多次遇到这样的假死状况)。重启机器后查看系统日志「/var/log/messages」会发现「Out of Memory: Kill process 1865(sshd)」类似的错误信息。

还在担心服务器进程被OOM?只需一招,即可避免

如何防止重要的系统进程触发(OOM)机制而被杀死呢?只需要一招,就可以轻松避免。

还在担心服务器进程被OOM?只需一招,即可避免

设置参数「/proc/PID/oom_adj为-17」,可临时关闭 Linux 内核的 OOM 机制。内核会通过特定的算法给每个进程计算一个分数来决定杀哪个进程,每个进程的 OOM 分数可以在「/proc/PID/oom_score」中找到。

处理办法

1. 方法一:设置参数/proc/PID/oom_adj为-17

如何防止mongod被杀,可以这样操作:

(1) 编写脚本文件oomadj.sh,内容如下:

  1. #!/bin/bash 
  2. netstat -ntlup |grep mongod |awk '{print$NF}' |awk -F '/' '{print$(NF-1)}' |while read PID; 
  3. do 
  4. echo -17 >/proc/$PID/oom_adj; 
  5. done 

(2) 设置定时计划

  1. [root@mnkj-mongodb-01 ~]crontab -e 
  2. */1 * * * * /root/oomadj.sh 

还在担心服务器进程被OOM?只需一招,即可避免

至于为什么用-17而不用其他数值(默认值为0),这个是由linux内核定义的,查看内核源码可知:

以 linux-3.3.6 版本的 kernel 源码为例,路径为「linux-3.6.6/include/linux/oom.h」,阅读内核源码可「oom_adj」的可调值为 15 到 -16,其中 15 最大-16 最小,-17 为禁止使用OOM。「oom_score」为 2 的 N 次方计算出来的,其中 N 就是进程的「oom_adj」值,所以「oom_score」的分数越高就越会被内核优先杀掉。

2. 方法二:修改内核参数禁止OOM机制

  1. # sysctl -w vm.panic_on_oom=1 
  2. vm.panic_on_oom = 1 //1表示关闭,默认为0表示开启OOM 
  3. # sysctl -p 

注意事项

注意:

  • Kernel-2.6.26之前版本的 oomkiller 算法不够精确,RHEL 6.x 版本的 2.6.32 可以解决这个问题。
  • 子进程会继承父进程的 oom_adj。
  • OOM 不适合于解决内存泄漏(Memory leak)的问题。
  • 有时 free 查看还有充足的内存,但还是会触发 OOM,是因为该进程可能占用了特殊的内存地址空间。

OOM killer 是保证系统内存不被个别进程消耗殆尽非常实用的机制,但是在实际工作除了进程运行过多会造成内存占用过高,还有很多其他的因素比如:访问增多、遭受攻击等...

这时我们不仅要使用好 OOM killer,更需要关注服务器的资源使用情况,需要完善的实时监控体系,能够对于系统存在问题能够及时的发现并处理,保证业务稳定运行。

 

责任编辑:赵宁宁 来源: 今日头条
相关推荐

2022-06-20 22:37:25

Linux操作系统命令

2022-06-14 23:34:10

Linux安全服务器

2022-06-27 17:46:53

PythonFlask

2022-06-15 08:21:49

Linux运维工程师

2022-06-15 08:25:07

Python天气数据可视化分析

2022-06-29 09:19:09

静态代码C语言c代码

2022-06-23 11:42:22

MySQL数据库

2022-06-30 11:03:27

DDoS攻击WAF

2022-06-27 19:01:04

Python应用程序数据

2022-06-23 12:43:36

区块链加密货币

2022-07-01 14:25:27

机器学习人工智能工业4.0

2022-06-24 10:16:59

Python精选库

2022-06-24 10:52:47

人工智能作业帮T前线

2022-07-01 05:47:19

PyCharm插件开发

2022-06-23 09:22:57

Vue技巧前端

2022-06-28 12:35:21

DockerPython

2022-06-24 11:14:00

美团开源

2022-06-28 09:26:25

Python配置文件

2022-06-20 13:34:46

漏洞网络攻击

2022-06-30 19:00:00

编辑推荐

运维工作到底是做什么的?给1到10年运维人的修仙指南Windows下的几种提权方式的粗略汇总推荐 | 10款优秀的SQL Server服务器监控工具9款优秀网络,服务器和应用程序监控工具
我收藏的内容
点赞
收藏

51CTO技术栈公众号