2020-09-17 Redis Can‘t save in background: fork: Cannot allocate memory

Redis占用内存过高报错

标题标点问题:CSDN BUG 在标题正文里,不识别英文单引号,保存英文单引号直接转为中文单引号 ’ 。除非是在代码块里才能正常显示英文的单引号

can't //输入英文单引号可以正确识别
can‘t //输入的中文单引号也可以正常识别。

redis 报错详情

Can't save in background: fork: Cannot allocate memory

解决方案

参考文章:redis Can’t save in background: fork: Cannot allocate memory 解决及原理

彻底的解决方式:
编辑文件 /etc/sysctl.conf 添加:

vm.overcommit_memory=1

执行

sysctl -p

使其生效;

vm.overcommit_memory 这个参数又是干什么的呢?

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

本次redis报错业务原因梳理

  1. 本地测试服务器停电后,Logstash 不是自动启动,也忘了手动启动,没有消费掉 redis 日志数据( 部署的 ELK 系统: filebeat 将日志打入 redis 之后 ,Logstash 消费 redis 里的日志传入 Elasticsearch)
  2. 存储的日志数据是没有设置过期时间,会一直存在(Logstash 消费 redis 数据很快,正常情况日志信息几乎不会长时间存在 redis 里),导致一直堆积在 redis 内存和硬盘存储文件里(Centos yum安装的redis的数据存储文件默认位置 /var/lib/redis/*.rdb)
  3. 此时 redis 再尝试向系统申请内存去进行 redis 内存数据写入硬盘,系统判定申请的内存资源过多不予以批准写入硬盘操作,导致 redis 一直报错。这个问题不解决 Logstash 启动也无法正常消费 redis 报错 redis 状态无法导致 Logstash 无法消费 redis 数据
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值