- Commit
英文单词,“交付”,在内存这里是指 内存交付
- Overcommit
意味: 过度交付,是指内存过度交付
- Linux程序如何申请内存(采用Overcommit策略)
Linux在分配内存的时候,一般会高于程序malloc()申请的内存,为了提高资源率,并不是所有程序申请了内存后不一定会用完。
具体测试如下:
Overcommit的策略
Linux下overcommit有三种策略(Documentation/vm/overcommit-accounting):
0. 启发式策略。合理的overcommit会被接受,不合理的overcommit会被拒绝。
1. 任何overcommit都会被接受。
2. 当系统分配的内存超过swap+N%*物理RAM(N%由vm.overcommit_ratio决定)时,会拒绝commit。
overcommit的策略通过vm.overcommit_memory设置。
overcommit的百分比由vm.overcommit_ratio设置。
# echo 2 > /proc/sys/vm/overcommit_memory
# echo 80 > /proc/sys/vm/overcommit_ratio
- 申请不到内存会咋样
在Unix中,当一个用户进程使用malloc()函数申请内存时,假如返回值是NULL,则这个进程知道当前没有可用内存空间,就会做相应的处理工作。许多进程会打印错误信息并退出。
尤其是redis。 这个时候可以通过把 overcommit_memory的值调整为1 处理。
- 什么情况下发生oom killer
当内存不足的时候会发生oomkiller。
- 什么情况下,linux会认为内存不足?
- 哪些程序会被oom kill掉
分数越高越有机会被干掉。
#!/bin/bash
for proc in $(find /proc -maxdepth 1 -regex '/proc/[0-9]+'); do
printf "%2d %5d %s\n" \
"$(cat $proc/oom_score)" \
"$(basename $proc)" \
"$(cat $proc/cmdline | tr '\0' ' ' | head -c 50)"
done 2>/dev/null | sort -nr | head -n 10
- 听说oom的时候会出现kernel panic,会出现重启
# panic , 等待20s 系统重启
kernel.panic = 20
- 参考
http://www.vpsee.com/2013/10/how-to-configure-the-linux-oom-killer/
http://blog.51yip.com/nosql/1776.html
https://github.com/datawolf/learning-kernel/blob/master/source/mem-management.rst
http://www.vpsee.com/2010/08/reboot-linux-after-a-kernel-panic/