问题描述

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

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

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

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

处理办法

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

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

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

#!/bin/bashnetstat -ntlup |grep mongod |awk '{print$NF}' |awk -F '/' '{print$(NF-1)}' |while read PID;doecho -17 >/proc/$PID/oom_adj;done

2、设置定时计划

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

至于为什么用-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.2 方法二:修改内核参数禁止OOM机制

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

注意事项

注意:

1、Kernel-2.6.26之前版本的 oomkiller 算法不够精确,RHEL 6.x 版本的 2.6.32 可以解决这个问题。

2、子进程会继承父进程的 oom_adj。

3、OOM 不适合于解决内存泄漏(Memory leak)的问题。

4、有时 free 查看还有充足的内存,但还是会触发 OOM,是因为该进程可能占用了特殊的内存地址空间。

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

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

企业还没有健全的监控体系?没关系,一个 SaaS 工具搞定你!

推荐大家一个运维监控工具——王教授。不仅可以接入业务的各式监控一图汇聚展示,还可以对监控的资源使用出现的问题,以及未来风险问题以告警的形式手机通知到个人,最大几率减小了运维事故的发生。

绑定对应云账号的AcessKey即可随时查看到该账户下所有资产状况,及时提醒云资源的变化情况,例如:服务器 CPU 使用率偏高、服务器安全组设置不安全、云数据库存在慢SQL等...

服务器 CPU 使用率偏高

云数据库存在慢查询

有需要的运维同学欢迎点击文末王教授二维码查看详情吧!


网站崩溃找不到原因?平台搭建无从下手?热门技术不想落伍?想要变强找不到资料?

加入[IT拯救联盟],让大牛和同伴拯救你,带你装x带你飞。定期干货分享、大牛专业解答、实用IT工具优选.....

私信小编“联盟”,即可加入我们~

inputstreamreader未关闭会导致oom_Linux内核OOM机制分析和防止进程被OOM杀死的方法...相关推荐

  1. inputstreamreader未关闭会导致oom_ThreadLocal 一定会导致内存泄露?

    在面试的时候,ThreadLocal作为高并发常用工具经常会被问到.而面试官比较喜欢问的问题有以下两个: 1.ThreadLocal是怎么实现来保证每个线程的变量副本的. 2.ThreadLocal的 ...

  2. inputstreamreader未关闭会导致oom_【搞定面试官】你还在用Executors来创建线程池?会有什么问题呢?

    前言 上文我们介绍了JDK中的线程池框架Executor.我们知道,只要需要创建线程的情况下,即使是在单线程模式下,我们也要尽量使用Executor.即: ExecutorService fixedT ...

  3. 数据库连接未关闭,导致数据库拒绝连接问题

    关于数据库连接未关闭,超过150条执行的问题,超过后数据库回拒绝监听

  4. Linux内核OOM机制的详细分析和防止进程被OOM杀死的方法

    转载自:http://blog.chinaunix.net/uid-29242873-id-3942763.html Linux 内核有个机制叫OOM killer(Out-Of-Memory kil ...

  5. oom机制分析及对应优化策略

    转载自https://blog.51cto.com/12814931/2343623 近日接了一些oom案子,此类问题通常是客户自身业务导致的问题.但现在客户的提问越来越复杂,通常情况下我们需要站在客 ...

  6. 【vagrant虚拟机扩容】 vagrant扩容硬盘时克隆失败--未关闭虚拟机导致

    vagrant导入镜像后,空间不足. 扩容硬盘时在克隆硬盘阶段出现以下2种看不太懂的错误 PS D:\MyEnvironment\VirtualBoxVMs\cdh2> vboxmanage c ...

  7. linux内核机制是什么,linux内核slab机制分析

    1.内部碎片和外部碎片 外部碎片 什么是外部碎片呢?我们通过一个图来解释: image.png 假设这是一段连续的页框,阴影部分表示已经被使用的页框,现在需要申请一个连续的5个页框.这个时候,在这段内 ...

  8. Linux内核NAPI机制分析

    转自:http://blog.chinaunix.net/uid-17150-id-2824051.html 简介: NAPI 是 Linux 上采用的一种提高网络处理效率的技术,它的核心概念就是不采 ...

  9. Linux tracing之内核vsyscallvdso机制分析

    由于Linux内核运行在受保护的地址空间上,系统中的用户空间程序无法直接跳转到内核代码执行,也就是由于权限的限制,用户程序不能直接调用内核的函数,因此,需要一种机制使应用程序可以某种方式通知内核,使应 ...

最新文章

  1. 踩到一个Emit的坑,留个纪念
  2. nRF52832 — 连接指定name、UUID、addr的蓝牙设备
  3. 杀毒软件原理进阶阶段
  4. pythonwhile循环实战教程_Python入门丨for循环和while循环
  5. 数据结构—链表-单链表应用-删除元素最大的节点
  6. linux应用调用内核函数,Hooking linux内核函数(一):寻找完美解决方案
  7. C#中Math.Round()实现中国式四舍五入
  8. mysql主从之slave-skip-errors和sql_slave_skip_counter
  9. 计算机网络物理层之数字传输系统
  10. you-get下载酷我音乐付费歌曲
  11. 普元EOS中如何往Session的UserObject中设置自定义属性
  12. html网页设计模板
  13. 计算机对写字教学的冲淡,不断改进评价方法努力促进写字教学
  14. 主流压缩软件压缩率实测(图文详解,揭秘你不知道的)
  15. 7种超轻量级的Linux发行版,希望能够帮助你找到适合自己的操作系统
  16. Java生成指定范围的随机数
  17. 极限竞速:地平线与现实手动挡汽车研究
  18. JS程序|Z字形变换
  19. MATLAB入门教程(基础知识点)
  20. 数学计算机软件课程,《数学软件》课程教学大纲.doc

热门文章

  1. web应用程序并发测试_测试并发应用
  2. jboss入门_JBoss Forge NetBeans集成–入门
  3. 确定Java等价性的新时代?
  4. JDK 12的Files.mismatch方法
  5. guava和commons_使用Guava CharMatcher和Apache Commons Lang StringUtils确定字符串中字符或整数的存在...
  6. Sun过去的世界中的JDK 11和代理
  7. activiti脚本任务_Activiti中的高级脚本:自定义配置注入
  8. 设计模式 命令模式 实例_根据您的命令-命令设计模式
  9. 在Oracle中使用JDBC插入功能
  10. 带有Netflix Ribbon的Spring Cloud Rest Client-基础知识