redis RDB快照持久化报错OOM

【问题】
各个使用了redis的业务系统突然挂了,报错:
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日志报错:
Can’t save in background: fork: Cannot allocate memory

查看redis的监控,redis本身的进程占用内存空间一直稳定在1.4G左右,没有大的变化

【原因】
redis的RDB持久化方案,会在每次持久化时fork一个进程来将数据保存到硬盘;这个报错是内存不够,导致fork失败,进而数据保存硬盘也失败了,最后用来修改数据的命令被禁用了。

【解决方式】
1.最快方式:将机器上的其它进程干掉给redis腾出足够的内存空间
2.临时解决方式:将redis的配置项stop-writes-on-bgsave-error改为no,默认值是yes;默认情况下,如果在RDB snapshots持久化过程中出现问题,设置该参数后,Redis是不允许用户进行任何更新操作
3.彻底解决方式:在/etc/sysctl.conf文件中添加vm.overcommit_memory=1,执行sysctl -p使其生效

关于vm.overcommit_memory参数
1:表示内核允许超量使用内存直到用完为止
2:表示内核决不超量使用内存,即系统整个内存空间不能超过swap+50%的RAM值,50%是overcommit_ratio默认值,此参数支持修改

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

参考:https://redis.io/topics/admin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值