本人从事UTM的开发工作,最近遇到out of memory killer.这里整理一下资料。

简述

当系统内存不足时,系统会触发 oom-killer。
oom-killer的机制就是选择杀掉最适合的进程,释放内存,增加系统的可用内存。

什么时候触发oom-killer?

触发oom-killer不是在malloc分配内存时;而是在真正使用分配的内存时,虚拟内存映射到物理地址时。
malloc的manual中有说明

By default, Linux follows an optimistic memory allocation
strategy. This means that when malloc() returns non-NULL
there is no guarantee that the memory really is available.
This is a really bad bug. In case it turns out that the sys‐
tem is out of memory, one or more processes will be killed by
the infamous OOM killer. In case Linux is employed under cir‐
cumstances where it would be less desirable to suddenly lose
some randomly picked processes, and moreover the kernel ver‐
sion is sufficiently recent, one can switch off this overcom‐
mitting behavior using a command like:
# echo 2 > /proc/sys/vm/overcommit_memory

overcommit是Linux的一种内存使用机制。通过/proc/sys/vm/overcommit_memory配置,有三种取值:

Overcommit_memory Description Comment
0 启发式策略 拒绝明显过大的内存分配。用于典型系统。root比普通用户可分配更多的内存。
1 允许overcommit 这种策略适合那些不能承受内存分配失败的应用,例如科学计算。
2 禁止overcommit 总内存使用空间不能超过swap+RAM*系数.当malloc时,内存不足会返回error。系数可以通过/proc/sys/vm/overcommit_ratio配置,默认50。

只要有overcomit机制,内存不足时,必定会触发oom-killer。

为什么使用oom-killer?

大多数主流发行版的内核都将/proc/sys/vm/overcommit_memory设置为0,意味着进程可以申请的内存比实际可用的更多。这是基于分配的内存并不一定立即使用的启发式策略和可能进程在它整个运行过程中没完全使用它分配的所有内存。
假如禁止overcommit,系统无法完全使用所有的内存,因此会浪费一部分。
overcommit允许系统以更有效的方式使用内存,但是有OOM的风险。
占用内存比较贪婪的进程可能会耗尽系统的内存,让系统停顿。
这就导致了一种情形,当内存很低时,甚至一个页也不够分配时,允许管理员杀掉合适的进程,让内核可以采取一些重要的操作例如释放内存。在这种情形下,oom-killer挑选并杀掉合适的进程为了系统其余的任务考虑。

oom-killer的处理机制

怎么选择最适合的进程?

通过一个评分机制(badness score)选择最适合的进程。badness score 通过/proc/<pid>/oom_score体现。
基于的原则就是用最小的损失换最大的内存。
badness score与该进程占用的内存,它的cpu时间,运行时间,它的/proc/<pid>/oom_adj,运行级别nice有关。
占用内存越多,运行时间越短,badness score越高。
相反,占用内存越少,运行时间越长,badness score越低。
假如badness进程是父进程,它和它的子进程都会被kill掉。
具体的实现参考内核oom_kill.c中 badness()函数。

参考链接:
Taming the OOM killer
When Linux Runs Out of Memory
How the Linux OOM killer works

linux oom-killer的更多相关文章

  1. Linux OOM killer 与相关参数详解

    一.前言 本文是描述Linux virtual memory运行参数的第二篇,主要是讲OOM相关的参数的.为了理解OOM参数,第二章简单的描述什么是OOM.如果这个名词对你毫无压力,你可以直接进入第三 ...

  2. Linux OOM Killer造成数据库访问异常排查

    服务器上的服务器访问异常,查看/va/log/messages发现如下: Sep 22 16:08:21 safeserver kernel: java invoked oom-killer: gfp ...

  3. 理解和配置 Linux 下的 OOM Killer

    原文:http://www.vpsee.com/2013/10/how-to-configure-the-linux-oom-killer/ 最近有位 VPS 客户抱怨 MySQL 无缘无故挂掉,还有 ...

  4. Linux系统OOM killer机制详解

    介绍: Linux下面有个特性叫OOM killer(Out Of Memory killer),会在系统内存耗尽的情况下出现,选择性的干掉一些进程以求释放一些内存.广大从事Linux方面的IT农民工 ...

  5. Linux进程被杀掉(OOM killer),查看系统日志

    基本概念: Linux 内核有个机制叫OOM killer(Out Of Memory killer),该机制会监控那些占用内存过大,尤其是瞬间占用内存很快的进程,然后防止内存耗尽而自动把该进程杀掉. ...

  6. 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #16 OOM Killer的运行与结构

    HACK #16 OOM Killer的运行与结构(1) 本节介绍OOM Killer的运行与结构. Linux中的Out Of Memory(OOM) Killer功能作为确保内存的最终手段,可以在 ...

  7. linux如何查看进程OOM killer

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

  8. Linux 的 Out-of-Memory (OOM) Killer

    同事在 Linux 服务器上遇到点小问题,我也上去折腾半天.这还是第一次注意到 Linux 这个多年来就存在的特性:OOM Killer .说白了 OOM Killer 就是一层保护机制,用于避免 L ...

  9. [Android Memory] Linux下malloc函数和OOM Killer

    http://www.linuxidc.com/Linux/2010-09/28364.htm Linux下malloc函数主要用来在用户空间从heap申请内存,申请成功返回指向所分配内存的指针,申请 ...

  10. Linux -- 内存控制之oom killer机制及代码分析

    近期,线上一些内存占用比較敏感的应用.在訪问峰值的时候,偶尔会被kill掉,导致服务重新启动.发现是Linux的out-of-memory kiiler的机制触发的. http://linux-mm. ...

随机推荐

  1. OpenStack Neutron配置虚拟机访问外网

    配置完成后的网络拓扑如下: 当前环境: X86服务器1台 Ubuntu 16.04 DevStack搭建OpenStack 网络拓扑: 外部网络:192.168.98.0/24 内部网络:10.0.0 ...

  2. React创建组件的三种方式比较

    推荐文章: https://www.cnblogs.com/wonyun/p/5930333.html 创建组件的方式主要有: 1.function 方式 2.class App extends Re ...

  3. Oracle 删除监听程服务

    1.开始->运行->输入regidit ->->->->->红框内的右键删除 2.开始->运行->输入regidit ->->-> ...

  4. 【ExtJS】FormPanel 布局(一)

    准备工作,布置一个最简单的Form,共5个组件,都为textfield. Ext.onReady(function(){ Ext.create('Ext.form.Panel', { width: 5 ...

  5. oracle系统包——DBMS_PIPE用法

    DBMS_PIPE包用于在同一例程(实例)的不同会话之间进行通信:注意,如果用户要执行包dbms_pipe中的过程和函数,则必须要为用户授权. sql>conn sys/oracle as sy ...

  6. HttpContext在多线程异步调用中的使用方案

    1.在线程调用中,有时候会碰到操作文件之类的功能.对于开发人员来说,他们并不知道网站会被部署在服务器的那个角落里面,因此根本无法确定真实的物理路径(当然可以使用配置文件来配置物理路径),他们唯一知道的 ...

  7. Lucene学习之四:Lucene的索引文件格式(1)

    本文转载自:http://www.cnblogs.com/forfuture1978/archive/2009/12/14/1623597.html Lucene的索引里面存了些什么,如何存放的,也即 ...

  8. springboot mybatis 使用多数据源

    SpringBoot系列博客目录,含1.5.X版本和2.X版本 springboot2.0正式版发布之后,很多的组件集成需要变更了,这次将多数据源的使用踩的坑给大家填一填.当前多数据源的主要为主从库, ...

  9. JSON与null

    org.json.JSONObject orgJSON = new org.json.JSONObject(); // The method put(String, Collection) is am ...

  10. mysql,简单介绍一下索引

    汉字很多,人力有时尽,人不可能记住所有的字,为了解决这个问题,于是有了字典.数据库里的数据很多,为了方便检索,于是有了索引. 索引,是一种数据结构,在这种数据结构中实现了高级的查找算法,索引可以帮助我 ...