overcommit_memory

overcommit_memory 是什么?
overcommit_memory是内存分配策略,内核对内存分配的一种策略。 
overcommit_memory 有什么作用?
overcommit_memory取值又三种分别为0, 1, 2 
overcommit_memory=0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够 的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。 
overcommit_memory=1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。 
overcommit_memory=2, 表示内核允许分配超过所有物理内存和交换空间总和的内存 
overcommit_memory参数就是控制分配内存是否可以超过CommitLimit,默认是0,即启发式的overcommitting handle,会尽量减少swap的使用,root可以分配比一般用户略多的内存。1表示允许超过CommitLimit,2表示不允许超过CommitLimit
Overcommit 和 OOM
Linux对大部分申请内存的请求都回复"yes",以便能跑更多更大的程序。因为申请内存后,并不会马上使用内存。这种技术叫做Overcommit。当linux发现内存不足时,会发生OOM killer(OOM=out-of-memory)。它会选择杀死一些进程(用户态进程,不是内核线程),以便释放内存。

当oom-killer发生时,linux会选择杀死哪些进程?选择进程的函数是oom_badness函数(在mm/oom_kill.c中),该函数会计算每个进程的点数(0~1000)。点数越高,这个进程越有可能被杀死。每个进程的点数跟oom_score_adj有关,而且oom_score_adj可以被设置(-1000最低,1000最高)
查看overcommit_memory
cat /proc/sys/vm/overcommit_memory
设置内存分配策略
# 编辑/etc/sysctl.conf ,改vm.overcommit_memory=1,然后sysctl -p 使配置文件生效

# sysctl vm.overcommit_memory=1

# echo 1 > /proc/sys/vm/overcommit_memory

overcommit_ratio

overcommit_ratio是什么
代表的是系统中总的内存的百分比
只有 overcommit_memory=2的时候,它才生效
查看overcommit_ratio
cat /proc/sys/vm/overcommit_ratio
临时修改overcommit_ratio
sysctl overcommit_ratio=60

CommitLimit

commitlimit是什么
虚拟内存 
CommitLimit = SwapTotal + MemTotal * overcommit_ratio 
总的虚拟内存 = 总的交换分区 + 总的物理内存 * 
查看系统commitlimit
grep -i commit /proc/meminfo

vm.swappiness

vm.swappiness是什么
vm.swappiness = 0
最大限度使用物理内存,然后才是 swap空间,即在内存不足的情况下–当剩余空闲内存低于vm.min_free_kbytes limit时,使用交换空间。
在内存紧张时优先减少RAM里文件系统缓存的大小,而非使用swap空间,这是一种提高数据库性能的推荐做法。

vm.swappiness = 1
内核版本3.5及以上、Red Hat内核版本2.6.32-303及以上,进行最少量的交换,而不禁用交换。

vm.swappiness = 10
当系统存在足够内存时,推荐设置为该值以提高性能。

vm.swappiness = 60
默认值

vm.swappiness = 100
积极的使用交换空间。

对于内核版本为3.5及以上,Red Hat内核版本2.6.32-303及以上,多数情况下,设置为1可能比较好,0则适用于理想的情况下(it is likely better to use 1 for cases where 0 used to be optimal)
临时设置修改vm.swappiness
sysctl vm.swappiness=80

echo 10 > /proc/sys/vm/swappiness
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐