什么是Linux Overcommit和OOM

overcommit_memory是一个内核对内存分配的一种策略,它有三个可选值:0、1、2。

0. 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,

并把错误返回给应用进程。

1. 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。

2. 表示内核允许分配超过所有物理内存和交换空间总和的内存。

Linux对大部分申请内存的请求都回复"yes",以便能跑更多更大的程序。因为申请内存后,并不会马上使用内存。

这种技术叫做 Overcommit。

当linux发现内存不足时,会发生OOM killer(OOM=out-of-memory)。它会选择杀死一些进程

(用户态进程,不是内核线程),以便释放内存。

例如Linux下发现有如下报错信息,则说明系统发生了OOM killer

# dmesg | grep redis | grep "oom-killer"

redis-server invoked oom-killer: gfp_mask=0x280da, order=0, oom_adj=0, oom_score_adj=0

redis-server invoked oom-killer: gfp_mask=0x200da, order=0, oom_adj=0, oom_score_adj=0

redis-server invoked oom-killer: gfp_mask=0x200da, order=0, oom_adj=0, oom_score_adj=0

redis-server invoked oom-killer: gfp_mask=0x200da, order=0, oom_adj=0, oom_score_adj=0

redis-server invoked oom-killer: gfp_mask=0x280da, order=0, oom_adj=0, oom_score_adj=0

redis-server invoked oom-killer: gfp_mask=0x200da, order=0, oom_adj=0, oom_score_adj=0

redis-server invoked oom-killer: gfp_mask=0x200da, order=0, oom_adj=0, oom_score_adj=0

redis-server invoked oom-killer: gfp_mask=0xd0, order=0, oom_adj=0, oom_score_adj=0

redis-server invoked oom-killer: gfp_mask=0x280da, order=0, oom_adj=0, oom_score_adj=0

redis-server invoked oom-killer: gfp_mask=0x280da, order=0, oom_adj=0, oom_score_adj=0

redis-server invoked oom-killer: gfp_mask=0xd0, order=0, oom_adj=0, oom_score_adj=0

redis-server invoked oom-killer: gfp_mask=0x280da, order=0, oom_adj=0, oom_score_adj=0

redis-server invoked oom-killer: gfp_mask=0xd0, order=0, oom_adj=0, oom_score_adj=0

redis-server invoked oom-killer: gfp_mask=0xd0, order=0, oom_adj=0, oom_score_adj=0

redis-server invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0, oom_score_adj=0

redis-server invoked oom-killer: gfp_mask=0xd0, order=0, oom_adj=0, oom_score_adj=0

redis-server invoked oom-killer: gfp_mask=0x280da, order=0, oom_adj=0, oom_score_adj=0

当oom-killer发生时,linux会选择杀死该进程,例如:

Out of memory: Kill process 21809 (redis-server) score 951 or sacrifice child

Killed process 21809, UID 0, (redis-server) total-vm:33466920kB, anon-rss:32324096kB, file-rss:100kB

具体杀死哪个进程取决于选择进程的函数,选择进程的函数是oom_badness函数(在mm/oom_kill.c中),该函数

会计算每个进程的点数(0~1000)。

点数越高,这个进程越有可能被杀死。每个进程的点数跟oom_score_adj有关,而且 oom_score_adj可以被

设置(-1000最低,1000最高)。

理解memory overcommit的关键:commit(或overcommit)针对的是内存申请,内存申请不等于内存分配,内存

只在实际用到的时候才分配。

备注:

如何修改Linux vm.overcommit_memory的值,可用的方法有以下三种:

1).以root身份登录Linux,编辑/etc/sysctl.conf ,改vm.overcommit_memory=1,然后sysctl -p使配置文件生效

2).sysctl vm.overcommit_memory=1

3).echo 1 > /proc/sys/vm/overcommit_memory

linux内核killler,Linux内核参数overcommit_memory和OOM killer介绍相关推荐

  1. linux内核killler,Linux 的 OOM Killer 机制分析

    按需分配物理页面 很多情况下,一个进程会申请一块很大的内存,但只是用到其中的一小部分.为了避免内存的浪费,在分配页面时,Linux 采用的是按需分配物理页面的方式.譬如说,某个进程调用malloc() ...

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

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

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

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

  4. Linux内存清道夫--OOM Killer

    1.OOM Killer 1.1.OOM Killer定义 OOM(Out Of Memory) Killer作为linux系统中守护进程,主要在系统内存严重不足时开始工作.出现这种情况是因为服务器上 ...

  5. linux 内核参数 rss,Linux控制内存的内核参数

    环境 Red Hat Enterprise Linux (RHEL) 5.x (X86) 在 X86 高内存设备中,当用户进程使用 mlock() 在常规区域分配大量内存时,可重新使用的 lowmem ...

  6. Linux内核开发:内核模块参数

    目录 使用参数加载模块 module_param宏 读取和更改参数值 验证参数值 声明模块参数数组 有关模块参数的一些说明 在本文中,我们将向模块添加参数.使用参数,您可以在加载模块时访问模块全局变量 ...

  7. aix内核是linux,linux和aix内核参数检查

    安装oracle软件时需要设置操作系统级别的用户限制,后期检查可以使用如下命令,方便问题的排查工作 linux: tail -15 /etc/security/limits.conf tail -30 ...

  8. 【内核】linux内核启动流程详细分析【转】

    转自:http://www.cnblogs.com/lcw/p/3337937.html Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件 ...

  9. linux内核报告,Linux升级内核报告.docx

    Linux升级内核报告精要 我的Linux 内核升级记录 准备工作内核安装包的下载下载地址为: HYPERLINK "/pub/linux/kernel/" /pub/linux/ ...

最新文章

  1. 程序运行慢?你怕是写的假 Python
  2. 蜜糖变砒霜:90%美国公司区块链项目将不再重启
  3. 微软欢迎所有热爱开源软件的朋友们来投稿![征稿开放时间:2015年8月17日]
  4. html如何禁止用户缩放,html如何禁止页面缩放
  5. ASP.NET Core Web API下事件驱动型架构的实现(三):基于RabbitMQ的事件总线
  6. ES6新特性_Promise介绍与基本使用---JavaScript_ECMAScript_ES6-ES11新特性工作笔记024
  7. mysql mangodb哪个简单,mysql和mongodb学哪个更加容易
  8. python 中的堆栈 用列表实现
  9. 【1】JVM-内存模型
  10. daemontools安装和使用
  11. 移动互联网周刊第二期,不错,推荐给大家
  12. 对训练样本分布不均的思考
  13. Docker专题(六)-Docker镜像详解
  14. 救救我吧,今年27岁,想转行学大数据开发
  15. RTI路由服务---跨多个平台,系统和网络扩展和集成DDS系统
  16. 大数据(一)数据采集 3
  17. 威联通nas怎么更换大硬盘_更换NAS后,数据如何安全处理?聊聊NAS数据安全性那些事...
  18. Python之正则表达式匹配电话号码和邮箱
  19. 《离散数学及其应用》读书笔记【一】逻辑和证明
  20. ibatis使用方法

热门文章

  1. oracle 删除 queue,C++ stl队列Queue用法介绍:删除,插入等操作代码举例
  2. Ansible Tower - 使用入门 3 - 通过模板运行 Git 上的 Playbook 和 Role
  3. 如何在C#中使用反射获取集合元素类型
  4. MongoDB中的分页–如何真正避免性能下降?
  5. 中国计算机学会推出 CSP 非专业级别认证
  6. mysql 阿里云 版本_阿里云虚拟主机mysql已经支持版本切换,支持MySQL 5.7.25
  7. java 注解 jpa_详解Spring Data JPA使用@Query注解(Using @Query)
  8. mysql初级知识梳理与练习
  9. sql两个聚合列相同怎么区分_SQL高级查询(终)
  10. linux内核进程抢占,Re: Linux中进程能否被抢占