Linux TCP保活优化需调整tcp_keepalive_time(建议5–10分钟)、tcp_keepalive_intvl(建议30–60秒)和tcp_keepalive_probes(建议3–5次),配合启用SO_KEEPALIVE并适配防火墙超时,兼顾快速发现断连与降低探测开销。

Linux 中优化 TCP 保持连接的时间与心跳策略,核心是调整保活探测的启动时机、重试节奏和失败判定阈值,让系统更快发现失效连接,又不因频繁探测增加负担。默认的 2 小时才开始探测,在现代服务场景中明显过长,必须调优。
明确三个关键参数的作用
保活行为由以下三个内核参数控制,它们共同决定“什么时候开始探、隔多久再探、探几次就断”:
- tcp_keepalive_time:连接空闲多少秒后,发送第一个保活探测包。默认 7200(2 小时),建议根据业务容忍度设为 300–600(5–10 分钟)。
- tcp_keepalive_intvl:第一次探测无响应后,每次重发探测包的间隔秒数。默认 75,建议设为 30–60,加快失败确认速度。
- tcp_keepalive_probes:连续未收到响应的最大探测次数。默认 9,配合前两项,可算出总超时时间(例如 600 + 3×30 = 690 秒,即约 11.5 分钟断连)。建议设为 3–5,避免过度等待。
全局配置:适用于所有启用 SO_KEEPALIVE 的连接
通过 sysctl 修改,立即生效且影响整个系统:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 临时生效(重启后失效):
sudo sysctl -w net.ipv4.tcp_keepalive_time=600
sudo sysctl -w net.ipv4.tcp_keepalive_intvl=30
sudo sysctl -w net.ipv4.tcp_keepalive_probes=3 - 永久生效:将上述三行写入 /etc/sysctl.conf 或新建 /etc/sysctl.d/99-keepalive.conf,再运行 sudo sysctl -p 加载。
单连接定制:应用层精细控制
若只需对特定 socket(如数据库连接、RPC 长链)单独调优,不希望影响其他连接,可在代码中用 setsockopt 设置 TCP 层选项:
- TCP_KEEPIDLE:等效于 tcp_keepalive_time,单位秒;
- TCP_KEEPINTVL:等效于 tcp_keepalive_intvl,单位秒;
- TCP_KEEPCNT:等效于 tcp_keepalive_probes,单位次。
示例(C 语言):
int idle = 300, interval = 20, count = 3; setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPIDLE, &idle, sizeof(idle)); setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPINTVL, &interval, sizeof(interval)); setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPCNT, &count, sizeof(count));
配套注意事项
光调保活参数还不够,需结合实际场景协同优化:
- 务必先启用 SO_KEEPALIVE 选项,否则参数无效;
- 保活机制只检测传输层连通性,不能替代业务层心跳(如 HTTP 超时、自定义 ping/pong);
- 高并发短连接服务更应关注 tcp_tw_reuse 和 somaxconn 等连接建立与释放参数;
- 防火墙或 NAT 设备常有 5–30 分钟的连接空闲超时,保活间隔应略小于该值,防止被中间设备静默断开。

















