Linux 的 Out-of-Memory (OOM) Killer

本文深入探讨了Linux系统中OOMKiller的工作原理及其触发条件。详细介绍了32位CPU架构下的内存区域划分,并针对如何避免OOMKiller被触发提出了具体建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在 Linux 服务器上遇到点小问题,上去折腾半天。这还是第一次注意到 Linux 这个多年来就存在的特性:OOM Killer 。说白了 OOM Killer 就是一层保护机制,用于避免 Linux 在内存不足的时候不至于出太严重的问题,把无关紧要的进程杀掉,有些壮士断腕的意思。

先要学习点老知识,在 32 位CPU 架构下寻址是有限制的。Linux 内核定义了三个区域:

# DMA: 0x00000000 -  0x00999999 (0 - 16 <abbr title="Megabyte">MB</abbr>)
# LowMem: 0x01000000 - 0x037999999 (16 - 896 <abbr title="Megabyte">MB</abbr>) - size: 880MB
# HighMem: 0x038000000 - &lt;硬件特定&gt;

LowMem 区 (也叫 NORMAL ZONE ) 一共 880 MB,而且不能改变(除非用 hugemem 内核)。对于高负载的系统,就可能因为 LowMem 利用不好而引发 OOM Killer 。一个可能原因是 LowFree 太少了,另外一个原因是 LowMem 里都是碎片,请求不到连续的内存区域【根据我遇到的一个案例,一个猜想是 有些应用一次性请求比较大的内存,恰恰又是 880M 之内的,空闲的(LowFree)不够大,就会触发 OOM Killer 出来干活】。检查当前 LowFree 的值:

# cat /proc/meminfo |grep LowFree

检查LowMem内存碎片:

# cat /proc/buddyinfo

上面这条命令要在 2.6 Kernel 环境下有效。据说使用 SysRq 的方式更好,不过 Hang 的时候再用吧。参见 Metalink Note:228203.1 。

根据一些文档描述,OOM Killer 在 2.4 与 2.6 上表现是不一样的。2.4 的版本中是把新进来(新申请内存)的进程杀掉。而 2.6 上是杀掉占用内存最厉害的进程(这是很危险的,很容易导致系统应用瘫痪)。

对于 RHEL 4 ,新增了一个参数: vm.lower_zone_protection 。这个参数默认的单位为 MB,默认 0 的时候,LowMem 为 16MB。建议设置 vm.lower_zone_protection = 200 甚至更大以避免 LowMem 区域的碎片,是绝对能解决这个问题的(这参数就是解决这个问题出来的)。

而对于 RHEL 3 (Kernel 2.4) 似乎没什么好办法,一个是用 Hugemem 内核(天知道会不会引入新的毛病),一个是升级到 2.4.21-47 并且使用新的核心参数 vm.vm-defragment 控制碎片的数量。再就是使用 RHEL 4 (Kernel 2.6),这又绕回去了。说白了,如果遇到 OOM Killer ,基本上是低版本 Kernel 设计上有点缺陷。

其它,如果去查询 RedHat 的 Bug 库,会发现不少 Kernel 版本也有 Bug 的。尤其在使用 NFS 的场景。

Tip: OOM Killer 的关闭与激活方式:

# echo "0" > /proc/sys/vm/oom-kill
# echo "1" > /proc/sys/vm/oom-kill

更多参考信息:

转载于:https://www.cnblogs.com/zxc2man/p/7458288.html

### Linux OOM Killer 和 LowMemoryKiller 的区别 #### 作用场景 Linux中的OOM Killer和LowMemoryKiller都是为了应对系统内存不足的情况设计的,但它们的作用场景有所不同。OOM Killer主要用于处理严重的内存耗尽情况,即当系统的物理内存完全不足以满足新的内存请求时启动[^1]。相比之下,LowMemoryKiller是一种更为预防性的机制,它在系统剩余内存降到一定水平之前就主动干预,防止达到真正的OOM状态[^3]。 #### 工作原理 ##### OOM Killer OOM Killer的工作原理较为复杂。当某个进程尝试申请更多的内存却无法得到满足时,就会触发缺页异常(Page Fault Exception),进而进入内核空间寻求解决办法。如果此时发现整个系统已无足够的自由页面可供分配,则激活OOM Killer逻辑链路。随后,OOM Killer依据特定算法计算各个现有进程中哪些最适合作为牺牲品被终止以腾出必要资源[^2]。此过程涉及评估各候选对象的重要性及其消耗状况等因素综合考量得出结论[^4]。 ##### LowMemoryKiller (LMK) 另一方面,LowMemoryKiller采用了一套相对简单直接的方法论来进行预判性调控。它预先设定了若干个关于可用RAM数量的不同临界点(thresholds),一旦检测到实际可利用量跌至任何一个设定值之下,便立即行动起来甄选目标加以清除。具体而言,它是按照事先规定好的几个调整参数(adj values)分类排列所有正在运行的应用程序实例,并优先考虑那些既定级别较高因而被认为重要程度较低者予以处置;而且这种判定还会考虑到各自所占存储容量大小以便做出更加精准的选择标准[^5]^。 ```python def compare_oom_lmk(): """ A function to illustrate the difference between OOM Killer and LowMemoryKiller. This is a conceptual representation rather than actual implementation code. Returns: dict: Comparison of OOM Killer vs LowMemoryKiller characteristics. """ comparison = { 'Mechanism': { 'OOM_Killer': 'Triggers when system runs out of memory entirely.', 'LowMemoryKiller': 'Preemptively kills processes based on predefined thresholds.' }, 'Trigger Point': { 'OOM_Killer': 'When physical memory cannot fulfill new requests.', 'LowMemoryKiller': 'Before reaching critical low-memory conditions.' }, 'Process Selection Criteria': { 'OOM_Killer': ('Based on complex scoring algorithms considering process importance ' 'and resource consumption.'), 'LowMemoryKiller': ('Uses adj values with priority given to less important processes,' 'also considers memory usage.') } } return comparison ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值