Redis在启动时可能会出现这样的日志:
WARNING overcommit_memory is set to 0! Background save may fail under low memory condition.
To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf
and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
在分析这个问题之前, 首先要弄清楚什么是overcommit?
Linux操作系统对大部分申请内存的请求都回复yes, 以便能运行更多的程序。 因为申请内存后, 并不会马上使用内存, 这种技术叫做overcommit。 如果Redis在启动时有上面的日志, 说明vm.overcommit_memory=0, Redis提示把它设置为1。 vm.overcommit_memory用来设置内存分配策略, 有三个可选值, 如表:可用内存代表物理内存与swap之和
Linux根据参数vm.overcommit_memory
设置overcommit:
- 0——默认值,启发式overcommit,它允许overcommit,但太明显的overcommit会被拒绝,比如malloc一次性申请的内存大小就超过了系统总内存。
- 1——Always overcommit. 允许
overcommit
,对内存申请来者不拒。 - 2——不允许
overcommit
,提交给系统的总地址空间大小不允许超过。
设置
那么如何设置overcommit的值呢?有三种方法:
- 编辑/etc/sysctl.conf ,改vm.overcommit_memory=1,然后sysctl -p使配置文件生效
- sysctl vm.overcommit_memory=1
- echo 1 > /proc/sys/vm/overcommit_memory
示例:
[root@bk ~]# echo "vm.overcommit_memory=1" >> /etc/sysctl.conf
[root@bk ~]# sysctl vm.overcommit_memory=1
vm.overcommit_memory = 1
[root@bk ~]# cat /proc/sys/vm/overcommit_memory
1