问题描述:

Redis连接不上,但是redis已经启动,程序报错:

【192.168.104.104:6379/0】状态不可用,等待后台检查程序恢复方可使用。
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.
misconf redis被配置以保存数据库快照,但misconf redis目前不能在硬盘上持久化。
用来修改数据集合的命令不能用,请使用日志的错误详细信息。

查看日志 redis.log 错误信息如下:

7225:M 12 Oct 15:43:54.028 # Can’t save in background: fork: Cannot allocate memory
7225:M 12 Oct 15:44:00.006 * 10 changes in 300 seconds. Saving…

查看内存:

Redis启动后剩余内存一致在变化 180~140M 左右
Redis关闭后 内存剩余 500+M
Redis工作至少需要 300+M 内存空间
尝试重启Redis 短暂连接后失败。

问题原因:

由于内存有限,Redis运行Fork进程时内存不够用。
Redis数据回写机制分为同步和异步两种:

  1. 同步写(SAVE)命令,主进程直接向磁盘回写数据,数据量大会导致系统假死很长时间,不推荐。
  2. 异步写(BGSAVE)命令,主进程fork后,复制自身并通过新的进程回写磁盘,回写结束后关闭,不需要主进程阻塞即系统不会假死,Redis默认使用该方法。
    但是另起一个相同进程(Redis运行在内存中),在内存不够下一定会导致内存无法分配问题发生。

解决办法:

方案一:

目前情况无法增加内存,但可以通过修改内核参数来调整内存分配策略来避免报错。

  1. 编辑/etc/sysctl.conf ,改vm.overcommit_memory=1
  2. sysctl -p 使配置生效(永久)

vm.overcommit_memory 内存策略有三种:

0:表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1:表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2:表示内核允许分配超过所有物理内存和交换空间总和的内存。

即使允许分配内存,实际剩余内存还是不够新进程完成写磁盘操作?
Linux对大部分申请内存的请求都回复"yes",以便能跑更多更大的程序。因为申请内存后,并不会马上使用内存。这种技术叫做 Overcommit。
当linux发现内存不足时,会发生OOM killer(OOM=out-of-memory)。它会选择杀死一些进程(用户态进程,不是内核线程),以便释放内存。
当oom-killer发生时,linux会选择杀死哪些进程?选择进程的函数是oom_badness函数(在mm/oom_kill.c中),该函数会计算每个进程的点数(0~1000)。
点数越高,这个进程越有可能被杀死。每个进程的点数跟oom_score_adj有关,而且 oom_score_adj可以被设置(-1000最低,1000最高)。

简而言之Linux会自动释放一些内存空间使申请内存的进程运行。

方案二:

限制Redis最大使用的内存Redis配置中有一个 “maxmemory” 在生成快照期间,Redis内存使用量会为 2*maxmemory + Redis占用内存。
具体情况如何,有待测试。

Redis写副本内存不够相关推荐

  1. 利用redis写webshell

    redis和mongodb我之所见 最近自己在做一些个人的小创作.小项目,其中用到了mongodb和redis,最初可能对这二者没有深入的认识. 都是所谓的"非关系型数据库",有什 ...

  2. Redis进阶之内存模型

    转载自   Redis进阶之内存模型 前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分. 我们使用Redis时, ...

  3. 挑战Redis单实例内存最大极限,“遭遇”NUMA陷阱!

    我们公司的基础架构部有个云Redis平台,其中Redis实例在申请的时候可以自由选择需要的内存的大小.然后就引发了我的一个思考,Redis单实例内存最大申请到多大比较合适?假设母机是64GB内存的物理 ...

  4. Redis 数据结构与内存管理策略(上)

    Redis 数据结构与内存管理策略(上) 标签: Redis Redis数据结构 Redis内存管理策略 Redis数据类型 Redis类型映射 Redis 数据类型特点与使用场景 String.Li ...

  5. 面试必问:用 Java 写一个内存泄漏程序

    编译:ImportNew/唐尤华 原文链接:stackoverflow.com/questions/6470651/creating-a-memory-leak-with-java 问题: 刚参加的一 ...

  6. Redis 如何做内存优化?

    Redis作为一个高性能的内存数据库,需要考虑内存的使用效率和优化.以下是一些Redis的内存优化策略: 使用合适的数据结构:Redis提供了多种数据结构,如字符串.哈希表.列表.集合和有序集合等.在 ...

  7. Redis占用大量内存并且报错 Can‘t save in background: fork: Cannot allocate memory

    Redis Can't save in background: fork: Cannot allocate memory 解决 先说如何解决: echo 'vm.overcommit_memory=1 ...

  8. 从“惊群”的现象来看并发锁,“死锁”问题的解决方案丨Redis单线程|共享内存|无锁实现|原子操作CAS

    从"惊群"的现象来看并发锁,"死锁"问题的解决方案 视频讲解如下,点击观看: 从"惊群"的现象来看并发锁,"死锁"问题的 ...

  9. python-docx 导出World写进内存中封装为response

    python-docx 导出Word写进内存中封装为response 因为公司需要将数据导出为word文件,恰好又是前后端分离开发,所以前端的请求需要携带Token.并不能简单的window.open ...

  10. Redis第一讲:相关的基础知识/数据类型/缓存的过期策略/双写一致性/内存存储和持久化

    Redis第一讲:相关的基础知识 摘要:本文是Redis(6.2.1)详解的第一讲,介绍Redis相关的基础知识,内存存储和持久化,Redis作缓存使用时的注意要点,常见的数据类型,缓存的过期策略,R ...

最新文章

  1. Python实用小技能,一个比一个高级!
  2. js进阶 9-5 js如何确认form的提交和重置按钮
  3. 《Cassandra权威指南》第二版书评及访谈
  4. 学生选课系统代码-1start.py代码
  5. shell之脚本片断
  6. Matlab画圆且坐标轴图片等比例显示
  7. 学语言python研究生专业目录一览表_本科专业与研究生学科专业目录对照表格模板...
  8. Excel多个sheet导出pdf
  9. c语言字符串转为大写,c语言 字符串转大写的简单实例
  10. 挖个大坑:挑战用纯micropython写一个nes模拟器(一)
  11. Tomcat配置指定JDK
  12. 羊皮卷之七:我要笑遍世界
  13. 阳春3月,这个技术博客要暂停1月!!!!
  14. dcos -1.7 都有哪些服务
  15. Python实现MATLAB bi2de函数
  16. 大数据应用技术实验报告六 Hive和MySQL
  17. ajax查询全国天气预报,使用聚合数据api接口
  18. 小程序版道歉文案自动生成 道歉神器源码分享
  19. 小米历史版本在哪下载
  20. ECDSA数字签名算法

热门文章

  1. Android 闹钟设置最新版
  2. 知网研学+OneDrive实现多电脑文献同步
  3. 八卦罗盘动态时钟(C语言)
  4. html表格中加入斜线,html中给表格添加斜线
  5. Hive | 用sort_array函数解决collet_list列表排序混乱问题
  6. 微信小程序-----消息模版(最全解释)
  7. TimeZone.getTimeZone 时区参数说明
  8. IP地址屏蔽功能设计
  9. C语言:判断一个数是不是素数(质数)
  10. 面试自我介绍和简历上的内容能不能相同?