近日我司生产环境的redis频繁异常不可访问,已经严重影响公司牛逼的产品起飞了,那么作为集设计、编码、测试、运维于一身的全栈吹牛皮工程师,必须给它搞上一搞。

生产环境出了问题后,其实就是登录失败时提示token无效。根据老衲多年写bug的经验,第一时间就想到redis出了问题。登录服务器,ps看了一眼redis的进程,没问题。又free看了一眼内存,我的个乖乖,64g内存还剩几百兆,这肯定不正常了啊。随即打开了redis的日志,看到满屏都是以下内容输出,有那么一瞬,就像一万只草泥马从心头奔过。

6663:M 10 Apr 03:42:42.077 * 1 changes in 900 seconds. Saving...
6663:M 10 Apr 03:42:42.077 # Can't save in background: fork: Cannot allocate memory
6663:M 10 Apr 03:42:48.086 * 1 changes in 900 seconds. Saving...
6663:M 10 Apr 03:42:48.086 # Can't save in background: fork: Cannot allocate memory
6663:M 10 Apr 03:42:54.097 * 1 changes in 900 seconds. Saving...
6663:M 10 Apr 03:42:54.097 # Can't save in background: fork: Cannot allocate memory
6663:M 10 Apr 03:43:00.006 * 1 changes in 900 seconds. Saving...
6663:M 10 Apr 03:43:00.006 # Can't save in background: fork: Cannot allocate memory

不过就这个日志来说,确实提示的也很清楚了,redis的fork进程没有办法分配到内存,这和我们查询到内存只有几百兆的情况也能吻合。天大地大,生产最大。不管三七二十八,先恢复环境访问。于是乎重启了rediis,系统能够正常的登录了。

你以为到这里就结束了吗?当然不可能,作为一个新时代的四有青年,我怎么可能仅仅满足恢复生产环境访问这么简单的地步呢?过两天万一又不可访问了,而恰巧那会儿我正在和霸飞忒烧烤大腰子,那岂不是显得我不尊重大腰子了。

还是看看redis的日志怎么说吧。打开刚刚启动的redis的日志,有一行warning瞬间引起了老衲的注意(得亏不是FBI WARNING)。

21515:M 10 Apr 16:31:10.232 # 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.

redis已经在启动的时候提前告诉使用者了,你最好给我把vm.overcommit_memory设置成1,要不然系统内存不够分配了,我可不能保证我能在后台给你把数据给你保存成功。这不是就和我们redis报错Cannot allocate memory不谋而合了嘛。来看看vm.overcommit_memory是个神马,它是linux内存分配策略的配置参数,有以下3个值:

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

而且redis很贴心的告诉了使用者,最好把vm.overcommit_memory设置成1,然后重启服务器,或者执行命令sysctl vm.overcommit_memory=1让其立即生效,但是重启后又还原。

既然redis都把饭喂到嘴边了,那你还不吃就不能怪谁了。话不多说,先来一波操作。在/etc/sysctl.conf中添加vm.overcommit_memory=1,生产环境暂时先不重启服务器。紧接着执行命令sysctl vm.overcommit_memory=1让其立即生效,这样来说即使某个月黑风高的夜晚,服务器重启了,这个配置也不会被还原。

当然这台服务器上不仅仅运行redis一个中间件服务,还有其他的服务,如果任由redis去无限制的申请内存,那么也会影响到其他中间件服务的运行。因此还需要在针对于redis自身进行最大内存的限制。

编辑/etc/redis.conf,找到maxmemory项,设置redis最大可以使用到的内存,单位为字节。重启redis服务使其生效。

这一波操作下来,redis运行一段时间没见出问题,通过日志查询,也未见Cannot allocate memory的错误了,我又可以和我们的小伙伴一起快乐地去玩耍了。

Redis说无法分配内存该怎么办?相关推荐

  1. Redis源码解析——内存管理

    在<Redis源码解析--源码工程结构>一文中,我们介绍了Redis可能会根据环境或用户指定选择不同的内存管理库.在linux系统中,Redis默认使用jemalloc库.当然用户可以指定 ...

  2. Redis常用操作和内存模型

    几个常用命令行 登录 redis-cli-h127.0.0.1-p6379-a123 查看内存 info memory 这里面 info 是命令 memory 是参数 单单输入 info 就死查看所有 ...

  3. 有了这篇你还说你不会redis性能优化、内存分析及优化

    点击上方 好好学java ,选择 星标 公众号重磅资讯,干货,第一时间送达 今日推荐:推荐19个github超牛逼项目!个人原创100W +访问量博客:点击前往,查看更多 来源: https://bl ...

  4. redis系列3---理解内存

    理解内存 为什么要理解内存呢?redis所有的数据都存在内存中如何高效利用内存,实现用更少的内存存更多的数据,从而降低成本 如何统计内存使用?info memory可以获取内存相关指标,如下:used ...

  5. stack vs heap:栈区分配内存快还是堆区分配内存快 ?

    作者 | 码农的荒岛求生 来源 | 码农的荒岛求生 有伙伴问到底是从栈上分配内存快还是从堆上分配内存快,这是个比较基础的问题,今天就来聊一聊. 栈区的内存申请与释放 毫无疑问,显然从栈上分配内存更快, ...

  6. 明明还有大量内存,为啥报错“无法分配内存”?

    作者 | 张彦飞allen 来源 | 开发内功修炼 近日小伙伴和我说了线上服务器出现一个诡异的问题,执行任何命令都是报错"fork:无法分配内存".这个问题最近出现的,前几次重启后 ...

  7. redis 槽点重新分配 集群_弄懂一致性哈希后我打通了redis分区集群的原理

    上午刚写完一篇关于一致性hash思想的举一反三,下午就去看redis的官方文档,就在我看到redis分区集群的原理的时候,哇那真是茅塞顿开把我多年对redis的疑惑都解开了,它分区的思想不就是我上篇文 ...

  8. 《深入理解redis》之三:内存管理的建议与技巧

    2019独角兽企业重金招聘Python工程师标准>>> 配置redis 如果想要运行一个内存高效的redis数据库,首先要理解那些在 redis.conf 配置文件中所有内存相关的指 ...

  9. Redis故障检查:内存问题

    目录 查询缓冲区 查询系统内存 大数据集 内存碎片 延迟问题检查完了,部署运行过程中的Redis还应该去检查可能的内存问题,因为Redis是一个基于内存的键值对数据存储服务器,里面所有的数据都是保存在 ...

最新文章

  1. RequireJS学习笔记(转)
  2. 第三章:Creating Utilities--24.一个交互式的计算器
  3. 仓库码放要求_货物码放规范
  4. U-boot mkimage指定Linux内核地址时的两种方式
  5. Apache ZooKeeper - 使用Apache Curator操作ZK
  6. 谷歌大脑Wasserstein自编码器:新一代生成模型算法
  7. 数据隔离、访问授权,用好大数据为什么这么难?
  8. [转]Mysql explain用法和性能分析
  9. 凸优化第五章对偶 5.9 广义不等式
  10. docker 集群swarm搭建
  11. 汽车电子-AUTOSAR基础简介
  12. PS进阶篇——如何PS软件给衣服换个颜色或图案风格(七)
  13. vue实现未登录不能访问某些页面
  14. 手机工行显示服务器,工行手机银行服务器安全证书验证失败
  15. “国家自主贡献亚洲交通倡议项目-中国部分”启动:实现交通运输零排放,中国至关重要...
  16. 哈勃深空场以及星系合并的宇宙瑰丽景象
  17. 虚化背景 - 基于镜头模糊滤镜的深度映射
  18. 分析一个错误使用MemoryCache导致的BUG
  19. 一个在线的文献计量分析工具(作者或文献间的联系可视化)
  20. IT在线教育产品竞品分析:极客学院、51CTO学院和慕课网比较

热门文章

  1. Parameters: { “silent“ } might not be used. This may not be accurate due to some parameters are
  2. BackTrack3 安装记录
  3. WIFI6 80211.ax 的理论速率计算及对照表
  4. 魅族手机便签的备忘录内容误删了怎么办?
  5. 【券后价9.90元】【包邮】荷叶茶冬瓜荷叶茶叶纯干玫瑰花茶袋泡花草茶包组合天然决明正品子...
  6. 如何在Linux杀死进程的名字?
  7. 区域性电子商务发展的四个机会
  8. File System | Debug | 如何查看文件挂载的分区以及分区大小
  9. 生成Aprilgrid标定板
  10. 在线答题小程序关于完形填空题的设计