tcp_keepalive_probes决定探测失败后最多重试次数,需与tcp_keepalive_time和tcp_keepalive_intvl协同调优;其值影响总检测时长,计算公式为:tcp_keepalive_time + (tcp_keepalive_probes × tcp_keepalive_intvl)。

要让 TCP 连接在异常断开时被内核及时发现,tcp_keepalive_probes 是关键一环——它决定探测失败后最多重试几次才关闭连接。这个参数不单独生效,必须配合 tcp_keepalive_time 和 tcp_keepalive_intvl 一起调优,否则无法达成预期效果。
理解 probes 的作用与计算逻辑
该参数控制“连续无响应时,内核发几次探测包就判定连接死亡”。它不改变探测何时开始、间隔多久,只影响最终的容错阈值。
整个保活超时时间 = tcp_keepalive_time + (tcp_keepalive_probes × tcp_keepalive_intvl)
- 默认值 9 次 → 探测阶段耗时 9 × 75 = 675 秒(约 11 分钟)
- 设为 3 次 → 探测阶段仅 3 × 60 = 180 秒(3 分钟),适合数据中心内部稳定网络
- 设为 5 次 → 平衡误判与响应速度,常见于云服务或混合网络环境
临时修改:快速验证配置效果
无需重启,立即生效,适合测试和调试:
-
查看当前值:
cat /proc/sys/net/ipv4/tcp_keepalive_probes -
设为 5 次:
echo 5 | sudo tee /proc/sys/net/ipv4/tcp_keepalive_probes -
同步调整配套参数(推荐组合):
echo 600 | sudo tee /proc/sys/net/ipv4/tcp_keepalive_timeecho 30 | sudo tee /proc/sys/net/ipv4/tcp_keepalive_intvl
注意:这些修改在系统重启后失效,仅作用于所有已启用 SO_KEEPALIVE 的套接字。
永久生效:写入 sysctl 配置文件
适用于生产环境,确保每次启动都加载正确策略:
- 编辑配置文件:
sudo nano /etc/sysctl.conf - 追加以下三行(不可只改 probes):
net.ipv4.tcp_keepalive_time = 600net.ipv4.tcp_keepalive_intvl = 30net.ipv4.tcp_keepalive_probes = 5 - 加载新配置:
sudo sysctl -p
这样设置后,空闲 10 分钟即启动探测,每 30 秒发一次,最多试 5 次(共 2.5 分钟),总检测窗口约 12.5 分钟,比默认的 2 小时 11 分钟更贴近实际业务容忍度。
验证是否真正起效
光改参数不够,得确认应用层也启用了 Keepalive:
- 检查某进程的 socket 是否启用:
ss -tnop | grep :端口号,看输出中是否有keepalive字样 - 抓包验证(如连接空闲后):
tcpdump -i any 'tcp[tcpflags] & (tcp-syn|tcp-fin|tcp-rst) != 0 or tcp[12] & 0xf0 > 0x50',观察是否在预期时间点出现 ACK 探测包 - 模拟断连测试:停掉对端服务,观察本端 socket 是否在
time + probes × intvl时间内触发ETIMEDOUT或关闭










