Chinaunix首页 | 论坛 | 博客
  • 博客访问: 130683
  • 博文数量: 30
  • 博客积分: 141
  • 博客等级: 入伍新兵
  • 技术积分: 175
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-10 10:00
文章分类

全部博文(30)

文章存档

2021年(1)

2018年(2)

2017年(6)

2016年(1)

2015年(5)

2014年(15)

我的朋友

分类: LINUX

2014-07-03 18:01:44

sysctl 中 vm.overcommit_memory 的含义

转自: http://iloutuoli.blogspot.kr/2011/11/sysctl-vmovercommitmemory.html

起因:周会的时候大家为这个参数吵了好久,最终的结果是没有结果,争吵的副作用是我有点头疼。在伟大的库爷的指点下,昨天终于大致搞清楚了这个东西。

vm.overcommit_memory 表示内核在分配内存时候做检查的方式。这个变量可以取到0,1,2三个值。对取不同的值时的处理方式都定义在内核源码 mm/mmap.c 的 __vm_enough_memory 函数中。

取 1 的时候 :
此时宏为 OVERCOMMIT_ALWAYS,函数直接 return 0,分配成功。

取 2 的时候: 
此时宏为 OVERCOMMIT_NEVER,内核计算:内存总量×vm.overcommit_ratio/100+SWAP 的总量,如果申请空间超过此数值,则分配失败。vm.overcommit_ratio 的默认值为50。

取 0 的时候:
此时宏为 OVERCOMMIT_GUESS,内核计算:NR_FILE_PAGES 总量+SWAP总量+slab中可以释放的内存总量,如果申请空间超过此数值,则将此数值与空闲内存总量减掉 totalreserve_pages(?) 的总量相加。如果申请空间依然超过此数值,则分配失败。

以上为粗略描述,在实际计算时,如果非root进程,则在计算时候会保留3%的空间,而root进程则没有该限制。详细过程可看源码。
大概过程如上所述,但还有很多数据结构还没搞清楚。高兴的时候再研究。

(1)vm.overcommit_memory 
默认值为:0
从内核文档里得知,该参数有三个值,分别是:
0:当用户空间请求更多的的内存时,内核尝试估算出剩余可用的内存。
1:当设这个参数值为1时,内核允许超量使用内存直到用完为止,主要用于科学计算
2:当设这个参数值为2时,内核会使用一个决不过量使用内存的算法,即系统整个内存地址空间不能超过swap+50%的RAM值,50%参数的设定是在overcommit_ratio中设定。
(2)vm.overcommit_ratio
默认值为:50
这个参数值只有在vm.overcommit_memory=2的情况下,这个参数才会生效。

Overcommit和OOM

在Unix中,当一个用户进程使用malloc()函数申请内存时,假如返回值是NULL,则这个进程知道当前没有可用内存空间,就会做相应的处理工作。许多进程会打印错误信息并退出。
Linux使用另外一种处理方式,它对大部分申请内存的请求都回复"yes",以便能跑更多更大的程序。因为申请内存后,并不会马上使用内存。这种技术叫做Overcommit。
当内存不足时,会发生OOM killer(OOM=out-of-memory)。它会选择杀死一些进程(用户态进程,不是内核线程),以便释放内
存。

也就是说这里存在一种情况, malloc的时候返回了yes,但是正真用的时候确发现获取不了memory,所以就OOM了,解决的办法是在/etc/sysctl.conf文件中加入下面2行, 然后执行sysctl -p 即可

vm.overcommit_memory = 2
vm.overcommit_ratio = 80

阅读(3587) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~