同事在 Linux 服务器上遇到点小问题,我也上去折腾半天。这还是第一次注意到 Linux 这个多年来就存在的特性:OOM Killer 。说白了 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) OOM killer “Out of Memory: Killed process” SOLUTIONS / SUMMARY【对我遇到的案例没鸟用】
  • 2) Metalink Notes : Linux Kernel Lowmem Pressure Issues and Kernel Structures
  • 3) Respite from the OOM killer

EOF

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

Linux 的 Out-of-Memory (OOM) Killer相关推荐

  1. android的oomkiller_[Android Memory] Linux下malloc函数和OOM Killer

    下面开始介绍与OOM Killer相关的proc文件系统. /proc//oom_adj 为/proc//oom_adj设置值就可以调整得分.调整值的范围为–16~15.正的值容易被OOM Kille ...

  2. linux内核killler,Linux内核参数overcommit_memory和OOM killer介绍

    什么是Linux Overcommit和OOM overcommit_memory是一个内核对内存分配的一种策略,它有三个可选值:0.1.2. 0. 表示内核将检查是否有足够的可用内存供应用进程使用: ...

  3. linux 系统日志 oom,Linux进程被杀掉(OOM killer),查看系统日志

    基本概念: Linux 内核有个机制叫OOM killer(Out Of Memory killer),该机制会监控那些占用内存过大,尤其是瞬间占用内存很快的进程,然后防止内存耗尽而自动把该进程杀掉. ...

  4. linux内核中内存耗尽OOM killer

    当内存严重不足时,页分配器在多次尝试直接回收失败后,就会调用内存耗尽OOM killer,选择杀死进程,释放内存. 先看一段oom 输出的错误 [ 7981.765805] kthreadd invo ...

  5. Out of memory, OOM killer输出信息分析

    当out of memory发生时,out_of_memory函数会选择一个内核认为犯有分配过多内存 "罪行"的进程,并杀死该进程. 这就有很大的几率腾出较多的空闲页,然后再跳转回 ...

  6. 理解和配置 Linux 下的 OOM Killer

    原文:http://www.vpsee.com/2013/10/how-to-configure-the-linux-oom-killer/ 最近有位 VPS 客户抱怨 MySQL 无缘无故挂掉,还有 ...

  7. (转载)Linux Out-of-Memory(OOM) Killer

    Linux有一个特性:OOM Killer,一个保护机制,用于避免在内存不足的时候不至于出现严重问题,把一些无关的进程优先杀掉,即在内存严重不足时,系统为了继续运转,内核会挑选一个进程,将其杀掉,以释 ...

  8. Linux——》Out of memory:kill process

    推荐链接:     总结-->[Java]     总结-->[Mysql]     总结-->[Spring]     总结-->[SpringBoot]     总结--& ...

  9. 服务器上tomcat进程突然终止问题排查 - OOM Killer

    服务器上tomcat进程突然终止问题排查 1)检查是否shell进程终止导致tomcat终止(排除) 由于使用./catalina.sh start启动tomcat,启动后tomcat的父PID为1, ...

  10. linux内核oom,linux OOM killer分析

    基本概念 Linux 内核有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽而内核会把该进程杀 ...

最新文章

  1. CentOS 6 安装 Git
  2. nvidia 程序安装失败
  3. cocos2d-x温故(三)!
  4. boost::intrusive::circular_list_algorithms用法的测试程序
  5. phpcms发布新闻到数据库_如何利用PHPCMS调用新闻列表
  6. ubuntu下面 将桌面换成 英文
  7. 大型项目使用Automake/Autoconf完成编译配置
  8. kotlin 查找id_Kotlin程序查找立方体区域
  9. apache安装步骤(redhat)
  10. ROS语音识别科大讯飞语音SDK
  11. 数据驱动的综合能源系统
  12. Hive基础04、Hive建表语句详解
  13. 思科SDN技术:ACI架构概述
  14. 功能安全-26262-理论到实践-基础知识-基于可靠性理论的的SIL与基于系统理论的STAMP
  15. 分布式对象存储oss-minio
  16. 58赶集基于 Docker 的自动化部署实践
  17. 适合学计算机用的机械键盘,一款好用的机械键盘应该怎么选?看完这篇就明白了...
  18. MQTT5.0新特性(比对3.1.1)
  19. 反相器的Cadence仿真
  20. 服务器上挂网站怎么挂,网站怎样上挂到云服务器

热门文章

  1. 「学习记录」《数值分析》第二章计算实习题(Python语言)
  2. 关于插件toastr的学习
  3. Hadoop平台搭建
  4. [原创]Installshield工具介绍
  5. Linux之find xargs
  6. 【小程序案例】支付宝小程序-MQTT模器,IoT设备通过WSS接入阿里云IoT物联网平台...
  7. Linux -chattr -隐藏权限(附加权限)
  8. spring加载classpath与classpath*的区别别
  9. 异步任务结果显示策略
  10. XFS:大数据环境下Linux文件系统的未来?