Linux TCP Keepalive需协同配置三个内核参数:tcp_keepalive_time(空闲后首探延迟)、tcp_keepalive_intvl(重试间隔)、tcp_keepalive_probes(最大失败次数),并确保应用层启用SO_KEEPALIVE选项。

Linux 系统中调整 TCP Keepalive 探活报文频率,关键不是单独改“发送间隔”,而是协同配置三个内核参数:启动探测的空闲时长、探测包之间的时间间隔、以及允许失败的最大次数。它们共同决定探活行为的实际节奏和断连时机。
三个参数各管什么
系统级 TCP Keepalive 不是定时发心跳包,而是在连接完全空闲(无任何数据收发)后才启动的被动探测机制:
- tcp_keepalive_time:连接空闲多少秒后,内核发出第一个探测包(纯 ACK)。默认 7200 秒(2 小时),对现代网络太长,建议设为 300–600(5–10 分钟),必须小于中间设备(如 NAT、防火墙)的空闲超时阈值
- tcp_keepalive_intvl:第一次探测未收到响应后,每隔多少秒重发一次探测包。默认 75 秒,可设为 20–40,加快异常判定速度
- tcp_keepalive_probes:连续多少次探测无响应,内核才关闭该连接。默认 9 次,总等待时间过长;设为 3–5 更合理,例如 300 + (3−1)×30 = 360 秒(6 分钟)即断连
临时调整:立即生效,重启失效
适合验证效果或应急处理:
- 查看当前值:sysctl net.ipv4.tcp_keepalive_time net.ipv4.tcp_keepalive_intvl net.ipv4.tcp_keepalive_probes
- 设为 5 分钟首探、30 秒重试、最多 3 次:
sudo sysctl -w net.ipv4.tcp_keepalive_time=300
sudo sysctl -w net.ipv4.tcp_keepalive_intvl=30
sudo sysctl -w net.ipv4.tcp_keepalive_probes=3
永久生效:生产环境必须做
避免重启后恢复默认值,推荐用独立配置文件管理:
- 创建配置文件:sudo nano /etc/sysctl.d/99-tcp-keepalive.conf
- 写入三行(等号前后保留空格):
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3 - 加载全部配置:sudo sysctl --system
光调参数还不够:确认应用是否启用 SO_KEEPALIVE
内核参数只是“探测行为”的开关,前提是应用层 socket 显式启用了保活选项。否则,再小的 time 值也无效:
- 检查某个连接是否启用:ss -ti | grep 'your_port',输出含 keepalive 才说明已启用
- Nginx、PostgreSQL、Swoole 等服务默认可能不开启,需查文档确认是否调用 setsockopt(..., SO_KEEPALIVE, &on, ...)
- Go、Java、Python 等语言客户端也需手动设置(如 Go 的 SetKeepAlive(true))


















