必须同步调大net.core.somaxconn和redis.conf的tcp-backlog至65535,否则Redis启动时会警告“TCP backlog setting cannot be enforced”,因内核限制(默认128)低于Redis配置值,导致全连接队列溢出、连接被静默丢弃。

net.core.somaxconn 和 redis.conf 的 tcp-backlog 必须对齐
Redis 启动时出现 WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128,说明内核限制卡死了 Redis 的连接队列能力。这不是 Redis 配置错了,而是 Linux 拒绝执行它想设的值。
关键点在于:tcp-backlog 是 Redis 告诉内核“我最多能 accept 多少个已完成三次握手的连接”,而 net.core.somaxconn 是内核实际允许的最大值——后者必须 ≥ 前者,否则 Redis 只能降级使用内核默认值(通常是 128 或 511)。
- 临时生效:
sudo sysctl -w net.core.somaxconn=65535 - 持久化:
echo 'net.core.somaxconn = 65535' | sudo tee -a /etc/sysctl.d/99-redis.conf && sudo sysctl --system - Redis 配置同步:在
redis.conf中写tcp-backlog 65535(6.2+ 版本生效;老版本需确认 glibc 支持) - 验证是否真正生效:
ss -lnt | grep :6379,看 Send-Q 列是否显示65535(不是128或511)
为什么只改 somaxconn 还不够?还得调 ulimit -n
全连接队列只是第一步。Redis 每个客户端连接都占用一个文件描述符(fd),如果 ulimit -n 太小,哪怕连接进了队列,accept() 成功后也会因无法分配 fd 而失败,日志里可能只报 Too many open files,不提 backlog。
典型组合值:
-
ulimit -n至少设为10032(maxclients 10000+ Redis 自身预留 32) - 持久化方式:在
/etc/security/limits.conf加两行:redis soft nofile 10032redis hard nofile 10032 - 注意:systemd 管理的 Redis 还需在 service 文件中加
LimitNOFILE=10032,否则 limits.conf 不生效
tcp_max_syn_backlog 影响的是半连接队列,高并发建连时不能忽略
当大量从节点或客户端同时发起连接(比如集群扩容、故障恢复),SYN 包洪峰会先进入“半连接队列”。这个队列由 net.ipv4.tcp_max_syn_backlog 控制。若它太小,SYN 包被内核直接丢弃,客户端看到的是超时或重传,tcpdump 里看不到 SYN-ACK 回复。
生产建议值:
-
net.ipv4.tcp_max_syn_backlog = 65535(和 somaxconn 保持一致) - 同步禁用
net.ipv4.tcp_abort_on_overflow = 0(默认是 0,但显式设为 0 更稳妥)——避免队列满时发 RST 干扰诊断 - 不要开
net.ipv4.tcp_tw_recycle(内核 4.12+ 已废弃,NAT 环境下会导致从节点连接失败)
client-output-buffer-limit replica 不是内核参数,但常被误认为 backlog 问题
主从断连日志里出现 Client output buffer limit reached,和 tcp-backlog 完全无关。这是 Redis 应用层缓冲区控制,防从节点拖慢导致主节点 OOM。
真要调,重点是这三个值:
-
client-output-buffer-limit replica 1073741824 536870912 60(硬限 1G,软限 512M,60 秒) - 必须配
repl-backlog-size 1073741824,否则从节点重连后无法做部分同步 - 这些参数改完不用重启 Redis,
CONFIG REWRITE或热 reload 即可生效
最容易被跳过的其实是 repl-backlog-size —— 很多人调大了 output buffer 却忘了它,结果从节点断连后重连仍全量同步,加重网络与磁盘压力。











