xianbei notes

世界因我而变

导航

sysctl 中 vm.overcommit_memory 的含义

Posted on 2012-11-23 09:09  先贝  阅读(2247)  评论(0编辑  收藏  举报

转自: 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进程则没有该限制。详细过程可看源码。