tcp_syn_retries 是什么
net.ipv4.tcp_syn_retries 控制本机作为客户端主动发起连接时,SYN 报文被重传的次数。默认 6 次,按 1、2、4、8、16、32 秒的指数退避累加,总共约 127 秒才会向应用返回连接失败。这个默认值对故障感知来说太慢:下游服务已经不可达,调用方却要挂两分多钟才报错,期间线程与连接池都被占住。内网服务常把它下调到 2 或 3,让故障更快暴露出来。
基本信息
| 参数 | net.ipv4.tcp_syn_retries |
|---|---|
| 默认值 | 6,退避累计约 127 秒后放弃 |
| 作用范围 | 本机所有主动发起的 TCP 连接,全局生效 |
| 配套参数 | net.ipv4.tcp_synack_retries 是服务端重传 SYN+ACK 的次数 |
| 与应用层关系 | 与 connect 超时叠加,实际等待以较小的一方为准 |
| 观测方式 | 抓包看 SYN 重传,或借应用侧连接建立耗时定位 |
典型使用场景
- 内网微服务调用:下游实例异常时希望快速失败并触发重试或熔断
- 连接池健康检查:建连长时间挂起会拖慢连接池的检测与补充
- 压测排除干扰:希望压测结果反映真实处理能力而不是等待超时
- 排查建连缓慢:抓包确认是否存在 SYN 重传,而不是应用自身阻塞
- 跨公网调用:链路抖动较多,需要在快速失败与避免误判之间权衡
查看与调整
查看与调整
sysctl net.ipv4.tcp_syn_retries # 读当前重试次数
sysctl -w net.ipv4.tcp_syn_retries=3 # 临时下调,约 7 秒后放弃
tcpdump -n -i eth0 'tcp[tcpflags] & tcp-syn != 0' | head # 观察 SYN 与重传
ss -tan state syn-sent | wc -l # 处于 syn-sent 状态的连接数落盘与回读
落盘与回读
# /etc/sysctl.d/99-net-tuning.conf
net.ipv4.tcp_syn_retries = 3 # 内网服务常用 2~3,缩短故障暴露时间
# 回读命令:sysctl net.ipv4.tcp_syn_retries重试次数与等待时间
| 取值 | 重传次数 | 放弃前累计等待 |
|---|---|---|
| 2 | 2 次 | 约 3 秒 |
| 3 | 3 次 | 约 7 秒 |
| 5 | 5 次 | 约 63 秒 |
| 6 | 6 次 | 约 127 秒,默认值 |
应用层的 connect 超时通常更短,先发生的是应用超时,内核仍在后台重传。因此这个参数主要影响那些没有设置连接超时的客户端,以及内核自身发起的连接。
这是全局参数:下调之后,数据库客户端、消息队列客户端、监控上报等所有出站连接都会更快失败。调整前梳理依赖方的超时与重试语义,避免把网络瞬时的丢包放大成业务失败。