启动Redis警告:WARNING overcommit_memory is set to 0 Background save may fail under low memory condition
启动redis里有一个警告:
$ src/redis-server
# Server initialized
# 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.
* Loading RDB produced by version 6.2.5
在警告里已经告诉我们如何解决该警告了,就是需要修改 /etc/sysctl.conf 配置文件,增加 vm.overcommit_memory = 1 这个配置项。
下面我们来看下,为什么要这么修改呢?
关于 /etc/sysctl.conf 配置
/etc/sysctl.conf是一个允许改变正在运行中的Linux系统的接口,它包含一些TCP/IP堆栈和虚拟内存系统的高级选项,修改内核参数永久生效。
/proc/sys目录下存放着大多数内核参数,并且可以在系统运行时进行更改,不过重新启动机器就会失效。
即,/proc/sys下内核文件与配置文件 sysctl.conf 中变量存在着对应关系。
Linux对大部分申请内存的请求都回复"yes",以便能跑更多更大的程序。因为申请内存后,并不会马上使用内存。这种技术叫做 Overcommit(过量使用)。
当linux发现内存不足时,会发生OOM killer(OOM=out-of-memory)。它会选择杀死一些进程(用户态进程,不是内核线程),以便释放内存。
内核参数 overcommit_memory
它是 内存分配策略。可选值:0、1、2。
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存
修改内核参数,要有root权限:
方法 1:编辑 /etc/sysctl.conf ,新增一行vm.overcommit_memory=1,然后sysctl -p使配置文件生效。
方法 2:临时设置:sysctl vm.overcommit_memory=1
直接使用 sysctl 命令修改:
sysctl 命令用于运行时配置内核参数,这些参数位于/proc/sys目录下。
测试修改成2:
$ sysctl vm.overcommit_memory=2
vm.overcommit_memory = 2
# 查看overcommit_memory配置,已经修改成2了:
$ cat /proc/sys/vm/overcommit_memory
2
再次修改成1试试:
$ sysctl vm.overcommit_memory=1
vm.overcommit_memory = 1
再次查看配置,已经修改成1了
$ cat /proc/sys/vm/overcommit_memory
1
可以看到,改命令其实就是修改/proc/sys命令下的(如 /proc/sys/vm/overcommit_memory 等)配置文件里的值。
直接修改配置文件 /etc/sysctl.conf
修改 /etc/sysctl.conf 文件,新增一行
vm.overcommit_memory = 1
使用 sysctl -p 是配置立即生效。
$ sysctl -p
vm.swappiness = 0
kernel.sysrq = 1
net.ipv4.neigh.default.gc_stale_time = 120
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
vm.overcommit_memory = 1
生效后,再次查看overcommit_memory配置,也已经修改成1了。
$ cat /proc/sys/vm/overcommit_memory
1
重新启动 redis,就不会再报 overcommit_memory 的警告了。
参考链接
http://blog.chinaunix.net/uid-30401178-id-5159439.html
https://www.cnblogs.com/Jtianlin/p/4339931.html
更多推荐
所有评论(0)