1. net.ipv4.tcp_keepalive_time/intvl/probes 长连接保活参数调优中默认值、内网与公网差异以及应用层 keepalive 与 TCP keepalive 的互补
net.ipv4.tcp_keepalive_time、tcp_keepalive_intvl、tcp_keepalive_probes 三个参数如何协同实现 TCP 长连接保活?默认值与内网/公网场景有何差异?应用层 keepalive 与 TCP keepalive 如何互补?
- 三个参数的语义:空闲多久探测、探测间隔、最大探测次数
- 默认值(7200s/75s/9 次)与内网公网场景的调优方向
- 应用层心跳与 TCP keepalive 的层级与互补关系
三个参数共同决定"空闲连接何时被探测、多久判定死亡":tcp_keepalive_time(默认 7200 秒)是连接空闲多久后发起首次探测;tcp_keepalive_intvl(默认 75 秒)是每次探测的间隔;tcp_keepalive_probes(默认 9 次)是连续无响应多少次后放弃并关闭连接。总判定时长约为 time + intvl × probes,默认约 2 小时 11 分,对公网高防/运营商中间设备(NAT 表项、防火墙空闲超时通常几分钟到半小时)而言太长,连接可能被中间设备静默回收,导致"应用不知情"的假活连接。内网直连场景中间设备少,默认值可接受;公网或经 NAT/负载均衡场景,通常调低为 time=60-300、intvl=10-30、probes=3-5,如 75×5 秒级判定。
应用层 keepalive 与 TCP keepalive 互补而非替代:TCP keepalive 由内核实现,不携带应用数据、无法探测应用是否真正存活(进程卡死但内核 socket 仍响应),且探测粒度受系统全局参数影响(也可用 setsockopt TCP_KEEPIDLE 等按连接定制);应用层心跳(如 MySQL、gRPC 的 ping、业务自定义 heartbeat)能验证应用逻辑与端到端路径(含代理、应用中间层)的真实可用性。生产实践通常是"双层保活":TCP keepalive 做底层死链回收,应用层心跳做业务级健康判定并驱动重连,两者结合才能避免假活与半开连接问题。
本题考察网络保活机制的完整理解。回答要点:三个参数协同的判定公式、默认值在公网场景的失效风险、内网/公网调优方向,以及"内核级探测 vs 应用级心跳"的层级互补——这是长连接治理(网关、数据库连接池、消息连接)的核心实操知识。
sysctl net.ipv4.tcp_keepalive_time net.ipv4.tcp_keepalive_intvl net.ipv4.tcp_keepalive_probes
# 公网/网关场景常用配置
sysctl -w net.ipv4.tcp_keepalive_time=60
sysctl -w net.ipv4.tcp_keepalive_intvl=15
sysctl -w net.ipv4.tcp_keepalive_probes=5