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