我是靠谱客的博主 搞怪雪碧,最近开发中收集的这篇文章主要介绍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

最后

以上就是搞怪雪碧为你收集整理的redis RDB快照持久化报错OOM的全部内容,希望文章能够帮你解决redis RDB快照持久化报错OOM所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(75)

评论列表共有 0 条评论

立即
投稿
返回
顶部