Linux系统OOM killer机制详解
介绍:
Linux下面有个特性叫OOM killer(Out Of Memory killer),会在系统内存耗尽的情况下出现,选择性的干掉一些进程以求释放一些内存。广大从事Linux方面的IT农民工兄弟或多或少都有遇到过吧。
现象:
主机SSH突然无法连接,主机重启要过很久,重启后主机正常,登录查看日志信息,会有大量的 " Out of Memory: Killed process xxx 、Out of Memory: Killed process xxx "
案例:
kernel: lowmem_reserve[]: 0 0 0 0
kernel: Normal free:0kB min:0kB low:0kB high:0kB active:0kB inactive:0kB present:0kB pages_scanned:0 all_unreclaimable? no
kernel: lowmem_reserve[]: 0 0 0 0
kernel: HighMem free:0kB min:128kB low:128kB high:128kB active:0kB inactive:0kB present:0kB pages_scanned:0 all_unreclaimable? no
kernel: lowmem_reserve[]: 0 0 0 0
kernel: DMA: 0*4kB 1*8kB 1*16kB 1*32kB 1*64kB 1*128kB 1*256kB 1*512kB 1*1024kB 0*2048kB 0*4096kB = 2040kB
kernel: DMA32: 22*4kB 4*8kB 1*16kB 1*32kB 0*64kB 0*128kB 1*256kB 1*512kB 1*1024kB 1*2048kB 0*4096kB = 4008kB
kernel: Normal: empty
kernel: HighMem: empty
kernel: 8917 pagecache pages
kernel: Swap cache: add 96509, delete 88464, find 14295/17401, race 0+4
kernel: Free swap = 0kB
kernel: Total swap = 262136kB
kernel: Free swap: 0kB
kernel: 262144 pages of RAM
kernel: 8801 reserved pages
kernel: 45869 pages shared
kernel: 8045 pages swap cached
kernel: Out of memory: Killed process 330, UID 500, (mysqld).
kernel: httpd invoked oom-killer: gfp_mask=0x201d2, order=0, oomkilladj=0
kernel:
kernel: Call Trace:
kernel: [<ffffffff802c2be6>] out_of_memory+0x8b/0x203
kernel:[<ffffffff8020fab8>] __alloc_pages+0x27f/0x308
kernel:[<ffffffff80213a38>] __do_page_cache_readahead+0xc8/0x1af
kernel:[<ffffffff802142a9>] filemap_nopage+0x14c/0x360
kernel:[<ffffffff80208e9d>] __handle_mm_fault+0x444/0x144f
kernel:[<ffffffff80234691>] lock_sock+0xa7/0xb2
kernel:[<ffffffff80232068>] release_sock+0x13/0xbe
kernel:[<ffffffff8022c1bd>] local_bh_enable+0x9/0x9c
kernel:[<ffffffff80234691>] lock_sock+0xa7/0xb2
kernel:[<ffffffff80267d94>] do_page_fault+0xf72/0x131b
kernel: [<ffffffff8041f85e>] move_addr_to_user+0x5d/0x78
kernel: [<ffffffff8041ff45>] sys_accept+0x18c/0x1d2
kernel: [<ffffffff8026082b>] error_exit+0x0/0x6e
kernel:
kernel: Mem-info:
kernel: DMA per-cpu:
kernel: cpu 0 hot: high 0, batch 1 used:0
kernel: cpu 0 cold: high 0, batch 1 used:0
kernel: cpu 1 hot: high 0, batch 1 used:0
kernel: cpu 1 cold: high 0, batch 1 used:0
kernel: DMA32 per-cpu:
kernel: cpu 0 hot: high 186, batch 31 used:46
kernel: cpu 0 cold: high 62, batch 15 used:12
kernel: cpu 1 hot: high 186, batch 31 used:25
kernel: cpu 1 cold: high 62, batch 15 used:14
kernel: Normal per-cpu: empty
kernel: HighMem per-cpu: empty
kernel: Free pages: 6040kB (0kB HighMem)
kernel: Active:120445 inactive:113583 dirty:0 writeback:0 unstable:0 free:1510 slab:4042 mapped-file:548 mapped-anon:234724 pagetables:7852
kernel: DMA free:2040kB min:32kB low:40kB high:48kB active:0kB inactive:0kB present:9060kB pages_scanned:0 all_unreclaimable? yes
kernel: lowmem_reserve[]: 0 994 994 994
kernel: DMA32 free:4000kB min:4016kB low:5020kB high:6024kB active:481780kB inactive:454332kB present:1018080kB pages_scanned:1718135 all_unreclaimable? yes
以上的日志信息标红处就是出现 OOM Killer(Out Of Memory killer)。
原理:
linux oom-killer是一种自我保护机制,当系统分配不出内存时(触发条件)会触发这个机制,由操作系统在己有进程中挑选一个占用内存较多,回收内存收益最大的进程kill掉来释放内存。
系统为每个进程做评估(/proc/<pid>/oom_score中数值最大的进程被kill掉)。
详见oom_killer.c
/**
* badness – calculate a numeric value for how bad this task has been
* @p: task struct of which task we should calculate
* @uptime: current uptime in seconds
*
* The formula used is relatively simple and documented inline in the
* function. The main rationale is that we want to select a good task
* to kill when we run out of memory.
*
* Good in this context means that:
* 1) we lose the minimum amount of work done
* 2) we recover a large amount of memory
* 3) we don’t kill anything innocent of eating tons of memory
* 4) we want to kill the minimum amount of processes (one)
* 5) we try to kill the process the user expects us to kill, this
* algorithm has been meticulously tuned to meet the principle
* of least surprise … (be careful when you change it)
*/
Linux下有3种Overcommit的策略(参考内核文档:vm/overcommit-accounting),可以在/proc/sys/vm/overcommit_memory配置。取0,1和2三个值,默认是0。
0:启发式策略,比较严重的Overcommit将不能得逞,比如你突然申请了128TB的内存。而轻微的Overcommit将被允许。另外,root能Overcommit的值比普通用户要稍微多些。
1:永远允许Overcommit,这种策略适合那些不能承受内存分配失败的应用,比如某些科学计算应用。
2:永远禁止Overcommit,在这个情况下,系统所能分配的内存不会超过swap+RAM*系数(/proc/sys/vm/overcmmit_ratio,默认50%,你可以调整),如果这么多资源已经用光,那么后面任何尝试申请内存的行为都会返回错误,这通常意味着此时没法运行任何新程序。
Linux系统OOM killer机制详解的更多相关文章
- Linux下OOM Killer机制详解
		
http://www.cnblogs.com/ylqmf/archive/2012/11/05/2754795.html http://wuquan-1230.blog.163.com/blog/st ...
 - Linux内核OOM killer机制
		
程序运行了一段时间,有个进程挂掉了,正常情况下进程不会主动挂掉,简单分析后认为可能是运行时某段时间内存占用过大,系统内存不足导致触发了Linux操作系统OOM killer机制,将运行中的进程杀掉了. ...
 - [r]Ubuntu Linux系统下apt-get命令详解
		
Ubuntu Linux系统下apt-get命令详解(via|via) 常用的APT命令参数: apt-cache search package 搜索包 apt-cache show package ...
 - Linux系统下Nginx安装详解
		
该随笔为个人原创,后期会根据项目实践实时更新,如若转载,请注明出处,方便大家获得最新博文! 注:安装Nginx需要Linux系统已经安装 openssl-fips-2.0.2.tar.gz zli ...
 - Linux系统挂载操作mount详解
		
在Linux系统中,文件系统不挂载是无法使用的.挂载,即是让文件系统在操作系统中可用.在Linux中使用mount命令来挂载文件系统,有永久性挂载和临时性挂载两种挂载方式. 1. 永久性挂载: 修改配 ...
 - 【Linux】Linux系统中的权限详解
		
我们linux服务器上有严格的权限等级,如果权限过高导致误操作会增加服务器的风险.所以对于了解linux系统中的各种权限及要给用户,服务等分配合理的权限十分重要. 一.文件基本权限 首先看下linux ...
 - LINux网络的NAPI机制详解一
		
在查看NAPI机制的时候发现一篇介绍NAPI引入初衷的文章写的很好,通俗易懂,就想要分享下,重要的是博主还做了可以在他基础上任意修改,而并不用注明出处的声明,着实令我敬佩,不过还是附上原文链接! ht ...
 - linux系统socket通信编程详解函数
		
linux socket编程之TCP与UDP TCP与UDP区别 TCP---传输控制协议,提供的是面向连接.可靠的字节流服务.当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之 ...
 - Ubuntu Linux系统下apt-get命令详解
		
整理了Ubuntu Linux操作系统下apt-get命令的详细说明,分享给大家.常用的APT命令参数: apt-cache search package 搜索包 apt-cache show pac ...
 
随机推荐
- 消息队列-ActiveMQ
			
1 业务需求描述 举例描述: 再警情通报的业务时通过发送消息界面可以选择 警情联络,和船情通报两种消息 发送方式可分为 一对一发送:部门对部门.个人对个人 一对多发送:部门对多部门.个人对多人 2 功 ...
 - Calender设置固定时间遇到的问题
			
在使用Calender获取实例,设置成UTC时区时,发现比我们常规的月份多了一个月: 示例代码如下: Calendar calendar = Calendar.getInstance(TimeZone ...
 - Spark结构式流编程指南
			
Spark结构式流编程指南 概览 Structured Streaming 是一个可拓展,容错的,基于Spark SQL执行引擎的流处理引擎.使用小量的静态数据模拟流处理.伴随流数据的到来,Spark ...
 - (9)集合之Set,HashSet,TreeSet
			
TreeSet子类 注意事项: 1.向TreeSet添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储 2.往TreeSet添加元素的时候,如果元素本身不具备自 ...
 - 给IIS添加网站配置权限
			
1.新建一个网站,填好名字,路径和主机名端口等等 2.为网站添加一个用户 3.用户隶属于Guests,和IIS_IUSRS 4.把网站的完全控制权限赋给刚才的用户. 在网站右键--编辑权限--安全 或 ...
 - [原创]HBase学习笔记(4)- 数据导入
			
需要分别从Oracle和文本文件往HBase中导入数据,这里介绍几种数据导入方案. 1.使用importTSV导入HBase importTSV支持增量导入.新数据插入,已存在数据则修改. 1.1.首 ...
 - JavaScript复习之--javascript数据类型隐式转换
			
JavaScript数据类型隐式转换.一,函数类 isNaN() 该函数会对参数进行隐式的Number()转换,如果转换不成功则返回true. alert() 输出的内容隐式的 ...
 - Modbus通信协议详解
			
附:http://www.360doc.com/content/14/0214/13/15800361_352436989.shtml 一.Modbus 协议简介 Modbus 协议是应用于电子控制器 ...
 - Mycat中的核心概念
			
Mycat中的核心概念 Mycat中的核心概念 1.数据库中间件 Mycat 是一个开源的分布式数据库系统,但是由于真正的数据库需要存储引擎,而 Mycat 并没有 存储引擎,所以并 ...
 - angular替代Jquery,常用方法支持
			
1.angular.bind(self,fn.args); 切换作用域执行 2.angular.copy(source,[destination]); 拷贝和深度拷贝 3.angular.eq ...