Redis:fork: Out of memory

线上项目报错,根据设置的报错发送邮件发时,通过查看邮件发现线上redis发生了异常:

Can't save in background: fork: Out of memory

 根据分析发现:

       redis在fork的时候,当这个进程的内存空间以G为单位时,fork就成为一件很恐怖的操作。何况在16G内存的主机上fork 14G内存的进程呢?肯定会报内存无法分配的。更可气的是,越是改动频繁的主机上fork也越频繁,fork操作本身的代价恐怕也不会比假死好多少。

根据原因,我们可以有如下解决方案:

在redis配置中:stop-writes-on-bgsave-error yes

      stop-writes-on-bgsave-error yes:在RDB snapshots持久化过程中出现问题,设置该参数后,Redis是不允许用户进行任何更新操作。

不彻底的解决方案:stop-writes-on-bgsave-error false

  这种方式:当redis写硬盘快照出错时,可以让用户继续做更新操作,但是写硬盘仍然是失败的。

彻底解决方案:

编辑文件 /etc/sysctl.conf 添加:

vm.overcommit_memory=1

执行sysctl -p使其生效;

Overcommit:Linux对大部分申请内存的请求都回复"yes",以便能跑更多更大的程序。因为申请内存后,并不会马上使用内存,将这些不会使用的空闲内存分配给其它程序使用,以提高内存利用率。

具体可以查看:点击

你可能感兴趣的:(错误总结)