Linux下面有个特性叫OOM killer(Out Of Memory killer),这个东西会在系统内存耗尽的情况下跳出来,选择性的干掉一些进程以求释放一些内存。相信广大从事Linux服务端编程的农民工兄弟们或多或少遇到过(人在江湖漂,哪有不挨刀啊)。典型的情况是:某天机器突然登不上了,能ping通,但是ssh死活连不了。原因是sshd进程被OOM killer干掉了(泪流满面)。重启机器后查看系统日志会发现血淋淋的Out of Memory: Killed process ×××、Out of Memory: Killed process 〇〇〇。一篇狼藉,惨不忍睹。
前段时间我就被OOM killer虐过一次。情况是这样的。一个简单的分布式系统,A,B,C等对称的节点分担处理X节点吐出的数据,然后将结果塞到Y节点去。结果负荷一大,ABC处理不过来,数据堆积在内存中,内存耗光,逼得OOM killer出来收拾局面,sshd被干掉,更杯具的是,重启后发现,syslogd也被干掉了,而且是在sshd前面被干掉。想查日志也只能查到一部分。血淋淋的。这也引出了分布式系统设计中的问题:想上面那种设计,要防止ABC中某个节点突然挂掉,然后导致其他节点负荷突然增加紧跟着也挂掉(连锁挂掉)。
回归正题,Linux下面的OOM killer到底是什么样一个机制呢,它在什么时候会跳出来,又会选择那些进程下手呢。
什么时候跳出来
先看第一个问题,它什么时候会跳出来。是不是malloc返回NULL的时候跳出来呢?不是的,malloc的manpage里有下面一段话:
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 system is out of memory, one or more processes
will be killed by the infamous OOM killer. In case Linux is
employed under circumstances where it would be less desirable to suddenly
lose some randomly picked processes, and moreover the kernel version
is sufficiently recent, one can switch off this overcommitting
behavior using a command like:
# echo 2 > /proc/sys/vm/overcommit_memory
上面一段话告诉我们,Linux中malloc返回非空指针,并不一定意味着指向的内存就是可用的,Linux下允许程序申请比系统可用内存更多的内存,这个特性叫Overcommit。这样做是出于优化系统考虑,因为不是所有的程序申请了内存就立刻使用的,当你使用的时候说不定系统已经回收了一些资源了。不幸的是,当你用到这个Overcommit给你的内存的时候,系统还没有资源的话,OOM killer就跳出来了。
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%,你可以调整),如果这么多资源已经用光,那么后面任何尝试申请内存的行为都会返回错误,这通常意味着此时没法运行任何新程序。
补充(待考证):在这篇文章:Memory overcommit in Linux中,作者提到,实际上启发策略只有在启用了SMACK或者SELinux模块时才会起作用,其他情况下等于永远允许策略。
跳出来之后选择进程的策略
好了,只要存在Overcommit,就可能会有OOM killer跳出来。那么OOM killer跳出来之后选目标的策略又是什么呢?我们期望的是:没用的且耗内存多的程序被枪。
Linux下这个选择策略也一直在不断的演化。作为用户,我们可以通过设置一些值来影响OOM killer做出决策。Linux下每个进程都有个OOM权重,在/proc/<pid>/oom_adj里面,取值是-17到+15,取值越高,越容易被干掉。
最终OOM killer是通过/proc/<pid>/oom_score这个值来决定哪个进程被干掉的。这个值是系统综合进程的内存消耗量、CPU时间(utime + stime)、存活时间(uptime - start time)和oom_adj计算出的,消耗内存越多分越高,存活时间越长分越低。总之,总的策略是:损失最少的工作,释放最大的内存同时不伤及无辜的用了很大内存的进程,并且杀掉的进程数尽量少。
另外,Linux在计算进程的内存消耗的时候,会将子进程所耗内存的一半同时算到父进程中。这样,那些子进程比较多的进程就要小心了。
当然还有其他的策略,大家可以参考文章:Taming the OOM killer和When Linux Runs Out of Memory。
【转自】
http://blog.dccmx.com/2011/04/oom-killer-on-linux
分享到:
相关推荐
Linux系统的OOM Killer处理机制 Linux系统的OOM(Out of Memory)Killer处理机制是一种内核机制,用于在系统内存不足时杀掉某个进程以腾出内存留给系统用,不致于让系统立刻崩溃。OOM Killer的触发条件是系统内存...
OOM Killer,全称为Out of Memory Killer,是Linux内核中的一种机制,用于处理系统内存不足的情况。当系统内存耗尽时,为了避免整个系统的崩溃,OOM Killer会选择并终止一些进程来释放内存,从而确保系统的稳定运行...
在Linux系统中,当内存资源紧张,即将耗尽时,为避免系统崩溃,Linux内核引入了一种称为OOM (Out Of Memory) Killer的机制。OOM Killer会选择性地杀死某些进程以回收内存。这一机制主要针对系统可用内存(包括Swap...
当Linux系统面临内存不足的压力时,内核会启动一个称为“Out-of-Memory (OOM) Killer”的机制来防止系统崩溃。然而,OOM Killer可能会选择终止重要的进程,包括Erlang应用程序。针对这种情况,有一个名为“heart_oom...
《理解Linux OOM Killer机制:从lab8_oom实验入手》 Linux操作系统的OOM (Out-Of-Memory) Killer是一个重要的内存管理机制,用于处理系统内存不足的情况。当系统资源极度紧张,无法分配新的内存时,OOM Killer会...
### Android LMK机制详解 #### 一、低内存管理(Linux vs Android) ##### 1.1 Linux 内存回收 在深入探讨Android的LMK机制之前,我们首先需要理解Linux内核是如何处理低内存情况的。 **1.1.1. shrink_slab 原理...
Mar 9 11:29:16 xxxxxx kernel: mysqld invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0, oom_score_adj=0 Mar 9 11:29:16 xxxxxx kernel: mysqld cpuset=/ mems_allowed=0 Mar 9 11:29:16 x
在Linux系统中,当系统内存不足时,OOM killer会被触发,它会选择并终止某些进程以回收内存,从而防止系统完全崩溃。描述提到的“oom_adj”是Linux内核中的一个参数,用于调整进程的OOM分数。将其设置为-17意味着这...
例如,理解Linux内核的oom killer机制,它根据每个进程的oom_score来决定优先杀死哪个进程。oom_score是基于进程的内存使用情况和其他因素计算出来的,较高的值表示更容易被杀死。 此外,内核层面的优化还包括调整...
1. OOM Killer:当系统内存极度紧张时,Linux会启动Out-of-Memory Killer,选择优先级低或消耗内存过多的进程进行杀死,以释放内存。 2. 内存气泡:内存气泡是一种优化技术,它允许空闲内存从一个进程转移到另一个...
又困又烦躁的我看了下手机,看看是不是我自己疯了把闹钟调得这么早,居然是早晨5点。然而不是,而是我们的监控系统显示,Plumbr服务出故障了。 作为这个领域的经验丰富的老鸟,我打开了咖啡机,这是正确...
1. **实现方式:** LMK是作为一个Shrinker实现的,而OOMKiller则是在内存分配时被调用(如果内存资源非常紧张的情况下)。这意味着LMK可以在内存紧张时更加主动地释放内存,而不是等到内存分配失败才采取行动。 2. ...
1 概述 Android的设计理念之一,便是应用程序退出,但进程还会继续存在系统以便...Android基于Linux的系统,其实Linux有类似的内存管理策略——OOM killer,全称(Out Of Memory Killer), OOM的策略更多的是用于分配内存
总之,Android内存优化涉及到多个层面,包括理解内存管理机制、有效使用Bitmap、避免内存泄漏以及定期进行内存分析。通过这些方法,开发者能够创建更稳定、高效的应用,减少OOM的发生,提高用户满意度。
在后续章节中,我们将深入探讨Linux OOM Killer的工作机制,以及如何避免MySQL因内存不足而被杀死的情况。了解并正确配置这些设置对于确保RDS(如网易云关系数据库服务)的稳定运行至关重要。通过优化内存管理和理解...
Linux内存管理机制包括多种层次和策略,旨在高效地分配和回收内存,避免内存耗尽和系统崩溃。本文将深入探讨Linux内存管理模型、伙伴系统、Slab分配流程以及内存回收策略。 首先,Linux内存管理模型将物理内存划分...
主要介绍了Android Web3j OOM解决详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧