首页/数据/数据库速查/网络参数调优(tcp-backlog / timeout / keepalive)
Redis 运维与场景124 条

网络参数调优(tcp-backlog / timeout / keepalive)

连接层参数:tcp-backlog 应对连接风暴(需配合 somaxconn)、timeout 回收空闲连接、tcp-keepalive 探测死连接。

数据库速查数据更新于 2026-10-13

连接层参数怎么调

连接层参数决定实例在连接风暴与空闲连接长期占用下的表现:tcp-backlog 是已完成三次握手、等待被 accept 的队列长度,需要与内核 net.core.somaxconn 匹配;timeout 回收空闲连接;tcp-keepalive 探测死连接;tcp-nodelay 关闭 Nagle 算法以降低小包延迟。

基本信息

适用Redis 全版本,部分参数需重启生效
tcp-backlog已完成握手的等待队列,需与内核 somaxconn 对齐
timeout空闲连接回收时间(秒),0 表示不断开
tcp-keepalive空闲连接心跳探测间隔(秒)
tcp-nodelay禁用 Nagle 算法,默认开启

配置示例

配置示例
tcp-backlog 511          # Redis 侧等待队列长度,内核 somaxconn 要匹配
timeout 300              # 空闲 300 秒断开,回收泄漏的空闲连接
tcp-keepalive 300        # 每 300 秒探测一次,及时识别死连接
tcp-nodelay yes          # 关闭 Nagle 算法,降低小包往返延迟
# 内核侧需同步(持久化写 /etc/sysctl.conf):
# net.core.somaxconn = 1024
# net.ipv4.tcp_max_syn_backlog = 1024

参数与排查口径

项含义排查要点
tcp-backlog已完成握手的等待队列长度连接风暴时溢出会丢连接
somaxconn内核允许的队列上限小于 tcp-backlog 时前者优先,配置白改
timeout空闲连接回收秒数设为 0 且连接池泄漏时连接数只涨不降
tcp-keepalive死连接探测间隔过长会导致僵死连接长期占用
Send-Q / Recv-Qss -lnt 输出中的队列情况可判断是否存在 backlog 溢出

典型使用场景

  • 连接数异常排查,确认是业务增长还是连接泄漏
  • 压测前评估连接风暴下的队列容量
  • 客户端连接池与实例参数联动调优
  • 内核参数与 Redis 参数对齐的基线检查
  • 迁移到新机器后确认 sysctl 配置已同步
连接数异常时不要只看服务端配置:用 ss -lnt 观察队列与 Send-Q,把 Redis 参数与内核 net.core.somaxconn 一起核对。
timeout 设置为 0 表示永不主动断开空闲连接,一旦客户端连接池存在泄漏,连接数会持续增长直至达到 maxclients。

排查顺序建议

  • 先用 ss -lnt 看队列与连接分布,判断是否真的存在溢出
  • 再核对内核 somaxconn 与 tcp-backlog 是否匹配
  • 然后检查 timeout 与 keepalive 是否符合客户端的连接复用习惯
  • 调整后观察连接数曲线与溢出计数是否改善,再决定是否继续调

易错点

  • 只调大 tcp-backlog 不改内核 somaxconn:内核限制优先,配置实际不生效
  • timeout 设为 0 且客户端有连接泄漏:连接数只涨不降,最终拒绝新连接
  • 忽略 tcp-keepalive:网络中断后僵死连接长期占用额度,故障切换后仍不释放
  • 新机器部署没有同步 sysctl:参数不一致导致压测结论无法复现

数据来源与参考

  • Redis 官方文档: tcp-backlog
  • Redis 官方文档: tcp-keepalive

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌