初始化配置(backlog、THP、overcommit_memory)
redis-server 运行时的issue
14396:M 02 Feb 2021 16:44:32.576 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
14396:M 02 Feb 2021 16:44:32.576 # 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.
14396:M 02 Feb 2021 16:44:32.576 # 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.
告警解决
以root执行
echo 1024 > /proc/sys/net/core/somaxconn
echo \vm.overcommit_memory = 1 >> /etc/sysctl.conf
sysctl vm.overcommit_memory=1
echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.local
echo 'echo 1024 > /proc/sys/net/core/somaxconn' >> /etc/rc.local
chmod +x /etc/rc.local
告警中包含的知识点:
TCP backlog
TCP backlog参考
可以将它简单理解为 TCP 连接队列,用于存放待处理的请求。当服务器处理请求之后,将其从队列中移出。这个队列是有大小的,通过 net.core.somaxconn 参数来限制。如果队列满了,则后续的请求会被直接丢弃。Redis 默认的 tcp-backlog 值为 511,而一般情况下,操作系统设置的值为 128。这种情况下,会限制 Redis 的性能发挥。
vm.overcommit_memory
Memory Overcommit 的意思是 操作系统承诺给进程的内存大小 超过了实际可用的内存。一般来说,一个保守的操作系统一般是有多少就分配多少,不会允许 overcommit 的情况发生。(这种方式其实是比较浪费内存,因为进程实际使用到的内存往往比申请的内存少,而没有用到的内存分配不出去就闲置了。)
Linux 允许 Memory Overcommit ,它对大部分申请内存的请求都是同意的,寄希望于进程实际上使用不到那么多内存,以便可以跑更多更大的程序。要注意,申请和分配是不同的概念,内存只有在使用时才会分配。
但万一用到了这么多呢?Linux 有一个 OOM(out of memory)机制来处理这种危机:挑选一个进程杀掉,腾出部分内存,如果不够就继续以上过程。overcommit_memory
有三种取值:0、1、2。分别对应不同的内存分配策略。
0:表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1:表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2:表示内核允许分配超过所有物理内存和交换空间总和的内存
Linux 上的默认值为 0,即不开启 Memory Overcommit。Redis 建议将该值设置为 1,是为了保证后台写操作(比如重写 AOF)能够在低内存下进行。
Transparent Huge Pages (THP)
Linux kernel 在 2.6.38 内核之后增加了 Transparent Huge Pages (THP) 特性 ,支持大内存页(2MB)分配,并且默认开启。而这个特性对于 Redis 而言,是弊大于利。
该特性开启时,虽然可以降低 fork 子进程的速度。但 fork 之后,每个内存页从原来 4KB 变为 2MB,会大幅增加重写期间父进程内存消耗。同时每次写命令引起的复制内存页单位放大了 512 倍,会拖慢写操作的执行时间,导致大量写操作慢查询。