第一个 Warning


内容

WARNING: The TCP backlog setting of 3000 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

翻译:
由于/proc/sys/net/core/somaxconn被设置为128,因此TCP backlog 设置为3000 无法生效;

解决:

echo 3000 > /proc/sys/net/core/somaxconn
backlog 和 somaxconn

backlog 参数描述的是服务器端 TCP ESTABELLISHED 状态对应的全连接队列长度。

somaxconn 定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数,默认值为128.限制了每个端口接收新tcp连接侦听队列的大小;对于一个经常处理新连接的高负载 web服务环境来说,默认的 128 太小了。大多数环境这个值建议增加到 1024 或者更多。

第二个 Warning


内容

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.

翻译:
overcommit_memory 设置为0,在内存不足时 后台备份可能失败,为了修复这个问题,可以 在 /etc/sysctl.conf 中 设置 vm.overcommit_memory = 1 ,然后重启 或者 执行命令 ‘sysctl vm.overcommit_memory=1’ 使修改生效;

解决:

echo "vm.overcommit_memory=1" > /etc/sysctl.conf
overcommit_memory

overcommit_memory 代表 内核对内存分配的 策略,位置在 /proc/sys/vm/overcommit_memory,可取值为 0、1、2;

0 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。

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

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

注意:redis在dump数据的时候,会fork出一个子进程,理论上child进程所占用的内存和parent是一样的,比如parent占用 的内存为8G,这个时候也要同样分配8G的内存给child,如果内存无法负担,往往会造成redis服务器的down机或者IO负载过高,效率下降。所以这里比较优化的内存分配策略应该设置为 1(表示内核允许分配所有的物理内存,而不管当前的内存状态如何)。

Overcommit和OOM

1、什么是Overcommit和OOM

在Unix中,当一个用户进程使用malloc()函数申请内存时,假如返回值是NULL,则这个进程知道当前没有可用内存空间,就会做相应的处理工作。许多进程会打印错误信息并退出。

Linux使用另外一种处理方式,它对大部分申请内存的请求都回复"yes",以便能跑更多更大的程序。因为申请内存后,并不会马上使用内存。这种技术叫做Overcommit。
当内存不足时,会发生OOM killer(OOM=out-of-memory)。它会选择杀死一些进程(用户态进程,不是内核线程),以便释放内存。

2、Overcommit的策略
Linux下overcommit有三种策略(Documentation/vm/overcommit-accounting):

  • 启发式策略。合理的overcommit会被接受,不合理的overcommit会被拒绝。
  • 任何overcommit都会被接受。
  • 当系统分配的内存超过swap+N%*物理RAM(N%由vm.overcommit_ratio决定)时,会拒绝commit。

overcommit的策略通过vm.overcommit_memory设置。
overcommit的百分比由vm.overcommit_ratio设置。

echo 2 > /proc/sys/vm/overcommit_memory
echo 80 > /proc/sys/vm/overcommit_ratio

当oom-killer发生时,linux会选择杀死哪些进程
选择进程的函数是oom_badness函数(在mm/oom_kill.c中),该函数会计算每个进程的点数(0~1000)。
点数越高,这个进程越有可能被杀死。
每个进程的点数跟oom_score_adj有关,而且oom_score_adj可以被设置(-1000最低,1000最高)。

第三个 Warning


内容
WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command ‘echo never > /sys/kernel/mm/transparent_hugepage/enabled’ as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

翻译:
在内核中启用了透明的大页面(THP)支持。这将导致Redis的延迟和内存使用问题。要解决此问题,请以root用户身份运行命令“echo never>/sys/kernel/mm/transparent_hugepage/enabled”,并将其添加到/etc/rc.本地以便在重新启动后保留设置。禁用THP后,必须重新启动Redis。

解决:

echo never > /sys/kernel/mm/transparent_hugepage/enabled。

启动redis 时 ,日志里还可能有如下信息导致无法启动

Increased maximum number of open files to 10032 (it was originally set to 1024).

此时需要 查看 open files,并设置为10032

ulimit -a 

ulimit -n 10032