Redis 优化之内存分配控制

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