linux oom-killer
本人从事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的更多相关文章
- Linux OOM killer 与相关参数详解
一.前言 本文是描述Linux virtual memory运行参数的第二篇,主要是讲OOM相关的参数的.为了理解OOM参数,第二章简单的描述什么是OOM.如果这个名词对你毫无压力,你可以直接进入第三 ...
- Linux OOM Killer造成数据库访问异常排查
服务器上的服务器访问异常,查看/va/log/messages发现如下: Sep 22 16:08:21 safeserver kernel: java invoked oom-killer: gfp ...
- 理解和配置 Linux 下的 OOM Killer
原文:http://www.vpsee.com/2013/10/how-to-configure-the-linux-oom-killer/ 最近有位 VPS 客户抱怨 MySQL 无缘无故挂掉,还有 ...
- Linux系统OOM killer机制详解
介绍: Linux下面有个特性叫OOM killer(Out Of Memory killer),会在系统内存耗尽的情况下出现,选择性的干掉一些进程以求释放一些内存.广大从事Linux方面的IT农民工 ...
- Linux进程被杀掉(OOM killer),查看系统日志
基本概念: Linux 内核有个机制叫OOM killer(Out Of Memory killer),该机制会监控那些占用内存过大,尤其是瞬间占用内存很快的进程,然后防止内存耗尽而自动把该进程杀掉. ...
- 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #16 OOM Killer的运行与结构
HACK #16 OOM Killer的运行与结构(1) 本节介绍OOM Killer的运行与结构. Linux中的Out Of Memory(OOM) Killer功能作为确保内存的最终手段,可以在 ...
- linux如何查看进程OOM killer
基本概念: Linux 内核有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽而内核会把该进程 ...
- Linux 的 Out-of-Memory (OOM) Killer
同事在 Linux 服务器上遇到点小问题,我也上去折腾半天.这还是第一次注意到 Linux 这个多年来就存在的特性:OOM Killer .说白了 OOM Killer 就是一层保护机制,用于避免 L ...
- [Android Memory] Linux下malloc函数和OOM Killer
http://www.linuxidc.com/Linux/2010-09/28364.htm Linux下malloc函数主要用来在用户空间从heap申请内存,申请成功返回指向所分配内存的指针,申请 ...
- Linux -- 内存控制之oom killer机制及代码分析
近期,线上一些内存占用比較敏感的应用.在訪问峰值的时候,偶尔会被kill掉,导致服务重新启动.发现是Linux的out-of-memory kiiler的机制触发的. http://linux-mm. ...
随机推荐
- IDEA里运行代码时出现Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Logger的解决办法(图文详解)
不多说,直接上干货! 问题详情 运行出现log4j的问题 -classpath "C:\Program Files\Java\jdk1.8.0_66\jre\lib\charsets.jar ...
- git学习笔记6
打标签 git tag -m "Say bye-bye to all previous practice." old_practice //引号里是注释 本地删除不是真的删除,对暂 ...
- Ldap用户登陆操作系统提示Permission denied, please try again.
昨天一个同事he告诉我他的ldap账户无法登录系统,提示Permission denied, please try again 解决方法: 先在百度上找了下别人的博客参考了下 https://blog ...
- Visual Studio 2013复制项目
在当前解决方案下复制项目的步骤: 1. 在硬盘存放代码的目录下将整个文件拷贝一份,修改文件夹名字,改成新的项目名称, 然后修改 *.csproj文件,名字必须与新项目名一致. 2. 在解决方案上右键 ...
- Mongodb定时备份脚本和清除脚本
Mongodb用的是可以热备份的mongodump和对应恢复的mongorestore,在linux下面使用shell脚本写的定时备份,代码如下 1.定时备份 #!/bin/bash sourcepa ...
- 前端渲染模板(一):Thymeleaf
一.使用 本篇文章将以SpringBoot为框架来介绍Thymeleaf的用法. 1 资源文件的约定目录结构 Maven的资源文件目录:/src/java/resources spring-boot ...
- linq中where与skipwhile区别
//字符串数组 string[] names = { "a1", "a2", "bcd","ab","bcde ...
- 远程桌面下启动MATLAB时的License Manager Error -103错误
之前使用学校提供的正版lincense,是通过MATLAB 官网注册下载的MATLAB 2017a,远程登录可用打开.后来学校停止购买了,时间紧迫,网上下载了一个standalone的lincense ...
- 互联网轻量级框架SSM-查缺补漏第三天
简言:平安夜,继续慵懒的学习.我真的是不喜欢学习··· 第三章认识MyBatis核心组件 3.1 持久层的概念和MyBatis的特点 持久层:可以将业务数据存储带磁盘,具有长期存储的能力.一般执行持久 ...
- js分离html代码的body内外部分
//定义网页源码 str = '<!DOCTYPE html><html><head> <meta charset="UTF-8"> ...