应用程序端报错:
"MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk"
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.”
解决方法:
1)redis配置文件定义logfile文件,方便看日志排错
2)修改配置文件增加下面行,已存在则修改原来的yes为no。
stop-writes-on-bgsave-error no
3)修改/etc/sysctl.conf 末尾增加 'vm.overcommit_memory = 1' ,重启生效,或运行命令'sysctl vm.overcommit_memory=1' 临时生效。
内核参数overcommit_memory
它是 内存分配策略
可选值:0、1、2。
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存
内存明明有剩余的,为何提示内存问题呢:
Redis在保存数据到硬盘时为了避免主进程假死,需要Fork一份主进程,然后在Fork进程内完成数据保存到硬盘的操作,如果主进程使用了4GB的内存,Fork子进程的时候需要额外的4GB,此时内存就不够了,Fork失败,进而数据保存硬盘也失败了。Redis的
数据回写机制分同步和异步两种,
1.同步回写即SAVE命令,主进程直接向磁盘回写数据。在数据大的情况下会导致系统假死很长时间,所以一般不是推荐的。
2.异步回写即BGSAVE命令,主进程fork后,复制自身并通过这个新的进程回写磁盘,回写结束后新进程自行关闭。由于这样做不需要主进程阻塞,系统不会假死,一般默认会采用这个方法。
参考链接:
https://www.cnblogs.com/kaituorensheng/p/5417273.html
http://www.redicecn.com/html/Linux/20131125/468.html
https://www.cnblogs.com/zxc2man/p/12911427.html
http://www.linuxidc.com/Linux/2012-07/66079.htm