redis故障处理 "Can’t save in background: fork: Cannot allocate memory"

来源:本站原创 IT必备工具 超过61 views围观 0条评论

搜索相关资料,这里说的比较详细

http://www.cnblogs.com/qq78292959/p/3994341.html
http://blog.csdn.net/zqz_zqz/article/details/53384854

1. 故障处理方式概述

这个错误是因为,redis有个默认选项
stop-writes-on-bgsave-error yes
在默认情况下,如果rdb snapshots持久化出现问题,设置这个参数后,redis不允许用户进行任何更新

不彻底的解决方式,将这个选项改为no
stop-writes-on-bgsave-error no
这样只是当redis写硬盘快照出错时,可以让用户继续做更新操作,但是写硬盘仍然是失败的。

彻底解决方式
编辑/etc/sysctl.conf添加
vm.overcommit_memory=1
执行sysctrl -p 使其生效

[root@  ~]# sysctl -p
vm.overcommit_memory = 1

10702:M 19 Oct 08:27:23.005 # Can’t save in background: fork: Cannot allocate memory
10702:M 19 Oct 08:27:29.012 * 10 changes in 300 seconds. Saving…
10702:M 19 Oct 08:27:29.016 * Background saving started by pid 11970
11970:C 19 Oct 08:27:29.905 * DB saved on disk
11970:C 19 Oct 08:27:29.907 * RDB: 0 MB of memory used by copy-on-write
10702:M 19 Oct 08:27:29.917 * Background saving terminated with success

Linux对大部分申请内存的请求都回复"yes",以便能跑更多更大的程序。因为申请内存后,并不会马上使用内存,将这些不会使用的空闲内存分配给其它程序使用,以提高内存利用率,这种技术叫做Overcommit。一般情况下,当所有程序都不会用到自己申请的所有内存时,系统不会出问题,但是如果程序随着运行,需要的内存越来越大,在自己申请的大小范围内,不断占用更多内存,直到超出物理内存,当linux发现内存不足时,会发生OOM killer(OOM=out-of-memory)。它会选择杀死一些进程(用户态进程,不是内核线程,哪些占用内存越多,运行时间越短的进程越有可能被杀掉),以便释放内存。
杀掉一些无用进程,以便有更多内存可用。

文章出自:CCIE那点事 http://www.jdccie.com/ 版权所有。本站文章除注明出处外,皆为作者原创文章,可自由引用,但请注明来源。 禁止全文转载。
本文链接:http://www.jdccie.com/?p=3966转载请注明转自CCIE那点事
如果喜欢:点此订阅本站
  • 相关文章
  • 为您推荐
  • 各种观点

暂时还木有人评论,坐等沙发!
发表评论

快捷键:Ctrl+Enter