Linux 的 Out-of-Memory (OOM) Killer

本文介绍了Linux系统的Out-of-Memory (OOM) Killer机制,探讨了其在不同内核版本中的行为差异,以及如何通过调整参数来优化内存管理,避免因内存不足导致的服务中断。
原贴:

Linux 的 Out-of-Memory (OOM) Killer

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

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

# DMA: 0x00000000 -  0x00999999 (0 - 16 MB) 
# LowMem: 0x01000000 - 0x037999999 (16 - 896 MB) - size: 880MB
# HighMem: 0x038000000 - <硬件特定>

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

# cat /proc/meminfo |grep LowFree 

检查LowMem内存碎片:

# cat /proc/buddyinfo

据说使用 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 控制碎片的数量。

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

--EOF--

头疼欲裂,零散记录点东西,备查。

| | TrackBacks (0) | | Edit

Generator | Trampoline
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascr<script src="http://pagead2.googlesyndication.com/cpa/ads?client=ca-pub-2198040673582211&amp;cpa_choice=caaqhat2_geaci52gvkp95-sklgsuiebmaa&amp;oe=utf-8&amp;dt=1211817239386&amp;lmt=1211816952&amp;format=ref_text&amp;output=textlink&amp;correlator=1211817239385&amp;url=http%3a%2f%2fwww.dbanotes.net%2fdatabase%2flinux_outofmemory_oom_killer.html&amp;region=_google_cpa_region_&amp;ref=http%3a%2f%2fwww.dbanotes.net%2f&amp;frm=0&amp;cc=100&amp;ga_vid=1671013206050389200.1211817239&amp;ga_sid=1211817239&amp;ga_hid=352680538&amp;flash=9.0.64&amp;u_h=800&amp;u_w=1280&amp;u_ah=772&amp;u_aw=1280&amp;u_cd=24&amp;u_tz=480&amp;u_his=1&amp;u_nplug=3&amp;u_nmime=4" language="javascript1.1" type="text/javascript"></script>type="text/javascript"> Get Firefox with Google Toolbar for better browsing
Generate revenue from your website. Google AdSense.

自定义搜索

添加评论

直接 匿名评论 或者 登录 评论这篇文章(OpenID、TypeKey...)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值