内存分配策略:overcommit_memory

2023年01月05日 2664点热度 0人点赞 0条评论

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

设置内存分配策略

# 永久修改
nano /etc/sysctl.conf
设置 vm.overcommit_memory=1
sysctl -p
# 临时修改
sysctl vm.overcommit_memory=1
echo 1 > /proc/sys/vm/overcommit_memory
sysctl -p

overcommit_ratio是什么
代表的是系统中总的内存的百分比
只有 overcommit_memory=2的时候,它才生效

查看overcommit_ratio

cat /proc/sys/vm/overcommit_ratio

临时修改overcommit_ratio

sysctl overcommit_ratio=60

commitlimit

虚拟内存
CommitLimit = SwapTotal + MemTotal * overcommit_ratio
总的虚拟内存 = 总的交换分区 + 总的物理内存 *

查看系统commitlimit

grep -i commit /proc/meminfo

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

路灯

这个人很懒,什么都没留下

文章评论