在使用 Redis 时,如果内存情况比较紧张的话,需要设定内核参数 overcommit_memory,指定内核针对内存分配的策略,其值可以是 012

0,表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。

1,表示内核允许分配所有的物理内存,而不管当前的内存状态如何。

2,表示内核允许分配超过所有物理内存和交换空间总和的内存

Redisdump 数据的时候,会 fork 出一个子进程,理论上 child 进程所占用的内存和 parent 是一样的,比如 parent 占用的内存为 8G,这个时候也要同样分配 8G 的内存给 child,如果内存无法负担,往往会造成 Redis 服务器的down 机或者 IO 负载过高,效率下降。所以这里比较优化的内存分配策略应该设置为 1(表示内核允许分配所有的物理内存,而不管当前的内存状态如何)

设置方式有两种,需确定当前用户的权限活使用 root 用户修改:

  1. 重设文件 echo 1 > /proc/sys/vm/overcommit memory(默认为 0)
  2. echo "vm.overcommit_memory=1" >> /etc/sysctl.conf
    /sbin/sysctl -p