博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux 的 Out-of-Memory (OOM) Killer
阅读量:6221 次
发布时间:2019-06-21

本文共 1540 字,大约阅读时间需要 5 分钟。

同事在 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)不够大,就会触发 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

更多参考信息:

  • 1) 【对我遇到的案例没鸟用】
  • 2) Metalink Notes : Linux Kernel Lowmem Pressure Issues and Kernel Structures

EOF

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

转载于:https://www.cnblogs.com/ericsun/p/3263743.html

你可能感兴趣的文章
NVIDIA Jetson TK1学习与开发(十):人脸检测(Face Detection)
查看>>
PHP读取日志里数据方法理解
查看>>
#大学#汇编指令查询
查看>>
Linux_CentOS-服务器搭建 <一>
查看>>
mybatis3.2.6整合spring4.0和springMVC4.0开发
查看>>
浅谈C之精华---指针
查看>>
主备不一致:Table definition on master and slave does not match
查看>>
通过JVM日志来进行安全点分析
查看>>
Linux makefile 教程 非常详细,且易懂
查看>>
我的 Android 开发实战经验总结
查看>>
java springboot b2b2c shop 多用户商城系统源码-eureka 项目构建过程(八)
查看>>
mono for android software自动更新
查看>>
版本管理工具——Git和TortoiseGit(乌龟Git)
查看>>
Web登录中的信心安全问题
查看>>
MySQL Proxy 实现 MySQL 读写分离提高并发负载
查看>>
FTP 服务器 下载目录下的所有文件到本地(FTP模式 非 SFTP模式)
查看>>
JavaScript下的encode和decode
查看>>
centos 文件编码转换命令
查看>>
操丛数据
查看>>
微软windows 8.1 Preview 预览版发布下载
查看>>