Linux默认TCP Keepalive参数保守(7200秒首探、75秒间隔、9次失败断连),易被中间设备中断;建议调优为300秒首探、30秒间隔、3次失败断连,总超时约11分30秒,并配合应用层心跳与SSH配置协同优化。

Linux 默认的 TCP Keepalive 参数偏保守,空闲 2 小时才开始探测,很容易被防火墙、NAT 设备或云厂商网关提前中断。调优的关键是缩短探测启动时间、加快探测节奏、合理控制失败容忍度,让系统更快发现并清理失效连接。
理解三个核心参数的实际含义
Keepalive 不是“心跳包”,而是内核在检测到连接长期无数据交互后,主动发起的轻量级探测(纯 ACK 包)。它由以下三个参数协同控制:
- tcp_keepalive_time:连接空闲多久后发送第一个探测包。默认 7200 秒(2 小时),对长连接服务来说太长,建议设为 300–600 秒(5–10 分钟)
- tcp_keepalive_intvl:两次探测之间的间隔。默认 75 秒,可缩至 30–60 秒,加快判定速度
- tcp_keepalive_probes:连续无响应时最多发几次探测。默认 9 次,设为 3–5 次更实用,避免过度等待
临时调优:用 sysctl 快速验证效果
适合调试、测试或应急调整,重启后失效,但能立刻生效:
- 查看当前值: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
永久生效:写入 /etc/sysctl.conf 并加载
生产环境必须做这一步,确保重启后配置不丢失:
- 编辑配置文件:sudo nano /etc/sysctl.conf
- 在末尾添加三行(若已存在同名项,直接覆盖):
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3 - 立即应用:sudo sysctl -p
配合应用层与 SSH 场景优化
仅调内核参数还不够,需结合具体使用场景:
- SSH 连接易断?除了内核 Keepalive,还需检查 /etc/ssh/sshd_config 中的 ClientAliveInterval 和 ClientAliveCountMax,建议设为 300 和 3,与内核参数对齐
- 自研服务需要更精细控制?在代码中用 setsockopt() 启用 SO_KEEPALIVE,再通过 TCP_KEEPIDLE/TCP_KEEPINTVL/TCP_KEEPCNT 单独设置某 socket 的保活行为(Linux 3.7+ 支持)
- 调试端口被占满?把 tcp_keepalive_time 缩短到 200 秒以内,能让闲置调试连接快速释放,避免阻塞后续开发接入











