启动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

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐