内核参数overcommit_memory对redis的影响

内核参数overcommit_memory对redis的影响

前言

生产环境中发生过一次redis故障,起因是在安装redis的那台机器A跑了一个php脚本,用来给用户进行消息推送的,但是由于没做限制.脚本占用的内存比较高,但是redis占用内存比例更大(已经配置了最大内存阈值,redis本身没超过内存最大值.)由于这台机器没有配置overcommit_memory参数,为了保护系统导致自动触发策略将占用最大内存得redis服务给kill了.并且配置持久化策略时,日志也有warnning提示你没有配置这个参数,那么这个参数到底有什么作用呢?如何去配置呢?我们一起来学习下.

什么是overcommit?

  • overcommit(申请内存)

linux为了能跑更多更大的程序,往往需要向内核中申请内存,而申请的内存并不会马上使用,这种技术叫overcommit. 

在内存空间充足的时候对于申请都是回复yes ,但是当内存不充足时会发生oom killer 他会选择杀死一些进程 (用户态进程,不是内核态)以便释放内存,我么可以通过配置参数来根据场景选择不同的模式

overcommit_memory参数

他是我们系统内核得一种内存分配策略,可选值 0  1  2

0  表示内核检查是否有足够得内存供进程使用,如果有,则内存申请被允许.否则申请失败,并且把错误返回给进程

1 表示内核允许分配所有得物理内存而不管当前内存状态如何

2 表示内核允许分配超过所有物理内存和交换内存空间得总和

示例: redis 持久化警告

[13223] 17 Mar 13:18:02.207 # 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.

备注:

这个warnning 就是说 当前overcommit_memory =0 (不配置就是0)对于系统处于低内存状态下申请内存会失效.导致无法执行aof 持久化.这是危险的.建议将参数设为1 来保证持久化的执行.

 

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Loading...