首页/数据/Redis 进阶速查/tcp-backlog 与连接积压
性能与排障129 条

tcp-backlog 与连接积压

tcp-backlog 定义已完成三次握手等待 accept 的连接队列长度(默认 511);高并发短连接场景需要同步放大内核 backlog 才能生效。

Redis 进阶速查数据更新于 2026-10-13

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-backlogRedis 配置等待 accept 的连接队列长度
net.core.somaxconnLinux 内核listen 队列的系统级上限
net.ipv4.tcp_max_syn_backlogLinux 内核半连接队列上限
rejected_connectionsINFO stats被拒绝的连接累计计数
connected_clientsINFO clients当前已建立的连接数
Redis 启动日志里会说明 backlog 是否被内核上限压住:出现无法强制生效的提示时,改 Redis 参数没有意义,必须先把内核水位抬起来。
两侧取值要配套:Redis 的 tcp-backlog 大于内核 somaxconn 时,实际生效的是其中更小的那个。
队列只是缓冲不是容量:它能吸收短时突发建连,但连接数或建连速率长期超出处理能力时,加长队列只会把失败推迟,让超时暴露得更晚。

易错点

  • 只改 Redis 一侧不抬内核上限,配置看着调大了其实没有生效
  • 把连接被拒一律归为 Redis 负载,忽略内核队列溢出这条路径
  • 用 CONFIG SET 试图动态改 tcp-backlog,命令报错后却以为参数已经改好
  • 内核参数只用 sysctl -w 临时修改,重启回到旧值,问题周期性复现

数据来源与参考

  • Redis 官方文档:tcp-backlog 说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌