001-Redis 记录错误 MISCONF Redis is configured to save RDB snapshots

96
霄峰
2019.05.05 17:28 字数 360
[2019-05-05 06:47:54]  -MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.  

解读Redis报错:“MISCONF Redis is configured to save RDB snapshots”

redis写硬盘快照出错,于是查看redis日志:

cat /var/log/redis/redis-server.log

...
[1428] 05 May 06:47:37.167 * 10 changes in 300 seconds. Saving...
[1428] 05 May 06:47:37.565 # Can't save in background: fork: Cannot allocate memory
...

redis Can’t save in background: fork: Cannot allocate memory 解决及原理
Redis 2种持久化模式的缺陷


解决方法

1. 修改 vim /etc/redis/redis.conf 配置:

stop-writes-on-bgsave-error no
maxmemory 751619276
# 由于本机自带内存只有1G,一般推荐Redis设置内存为最大物理内存的四分之三,所以设置0.75G,换成byte是751619276.
maxmemory-policy volatile-lru

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

vm.overcommit_memory=1

执行sysctl -p使其生效;

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

Redis