tcp-backlog 是什么
tcp-backlog 定义已经完成三次握手、正在等待被 accept 的连接队列长度,默认 511。实例繁忙时客户端连不上,常常就是这个队列或它背后的内核上限先满了:队列满之后新连接会被丢弃或握手超时,客户端看到的是连接被拒或连接卡住。
基本信息
| 配置项 | tcp-backlog |
|---|---|
| 默认值 | 511 |
| 生效方式 | 启动时读取,不能用 CONFIG SET 动态修改 |
| 内核配套 | net.core.somaxconn 与 net.ipv4.tcp_max_syn_backlog |
| 观测指标 | rejected_connections、connected_clients |
典型使用场景
- 高并发短连接场景:建连速率高,队列更容易被打满
- 客户端偶发连接失败:排除网络因素后检查队列与内核参数
- 扩容前评估:按目标并发连接数推算队列长度需求
- 容器化部署:容器内配置与宿主机内核参数要一起核对
- 故障复盘:把连接被拒的时间点与流量峰值对齐
- 配置审计:确认 Redis 侧与内核侧取值是合理的水位关系
判断顺序
- 确认现象:客户端报连接被拒还是连接超时,两者指向的队列不同
- 核对指标:rejected_connections 增长与 connected_clients 水位一起看
- 查配置:Redis 侧 tcp-backlog 与内核 somaxconn 哪个更小
- 验证结论:调整后在同等流量下重跑,确认拒绝计数不再增长
查看与调整
查看与调整
sysctl net.core.somaxconn # 查看系统 listen 队列上限
sysctl net.ipv4.tcp_max_syn_backlog # 查看半连接队列上限
sysctl -w net.core.somaxconn=4096 # 临时调整,重启失效
# 持久化:写入 /etc/sysctl.conf 后执行 sysctl -p 使其生效
redis-cli CONFIG GET tcp-backlog # Redis 侧取值(启动时生效)
redis-cli INFO stats | grep -E 'rejected_connections' # 被拒绝的连接计数
redis-cli INFO clients | grep -E 'connected_clients' # 当前连接数参数对照
| 参数 | 位置 | 作用 |
|---|---|---|
| tcp-backlog | Redis 配置 | 等待 accept 的连接队列长度 |
| net.core.somaxconn | Linux 内核 | listen 队列的系统级上限 |
| net.ipv4.tcp_max_syn_backlog | Linux 内核 | 半连接队列上限 |
| rejected_connections | INFO stats | 被拒绝的连接累计计数 |
| connected_clients | INFO clients | 当前已建立的连接数 |
Redis 启动日志里会说明 backlog 是否被内核上限压住:出现无法强制生效的提示时,改 Redis 参数没有意义,必须先把内核水位抬起来。
两侧取值要配套:Redis 的 tcp-backlog 大于内核 somaxconn 时,实际生效的是其中更小的那个。
队列只是缓冲不是容量:它能吸收短时突发建连,但连接数或建连速率长期超出处理能力时,加长队列只会把失败推迟,让超时暴露得更晚。