tcp-keepalive 的作用
tcp-keepalive 让内核定期向空闲连接的对端发送探测包,判断连接是否还活着,默认 300 秒。它解决的是「对端已经消失但本端不知道」的半开连接问题:客户端进程崩溃、网络设备静默丢表、链路中断时,没有探测的连接会一直占着服务端的连接槽与内存。跨公网或经过四层负载均衡的部署里,这个参数的价值更高。
基本信息
| 默认值 | 300(秒) |
|---|---|
| 主要作用 | 内核定期探测空闲连接,识别半开连接 |
| 相关参数 | 客户端心跳间隔、中间设备空闲超时 |
| 典型场景 | 跨公网连接、四层负载均衡之后的部署 |
| 配套关系 | 与客户端心跳一起使用,单侧探测覆盖不全 |
典型使用场景
- 半开连接清理:客户端异常退出后连接未被回收,探测能及时释放
- 经过网络设备:中间设备静默丢表时本端无从感知,靠探测兜底
- 连接数异常上涨:回收僵尸连接,避免连接槽被无效占用
- 负载均衡之后:客户端与 LB 超时错配时,服务端探测是最后一道防线
- 长连接运维:连接稳定但数量居高不下时,先确认探测是否生效
查看与调整
查看与调整
redis-cli CONFIG GET tcp-keepalive # 当前探测间隔
redis-cli CONFIG SET tcp-keepalive 60 # 按需调整,与客户端心跳配套
redis-cli INFO clients | grep connected_clients # 连接数是否随探测回落
redis-cli CLIENT LIST | head -10 # 看连接空闲时长与来源地址分布
sysctl net.ipv4.tcp_keepalive_time # 内核层默认值,别只看 Redis 配置相关参数对照
| 参数 | 位置 | 作用 |
|---|---|---|
| tcp-keepalive | Redis 配置 | 服务端向空闲对端发起探测的间隔 |
| tcp_keepalive_time | Linux 内核 | 内核层面开始探测的空闲时长 |
| 中间设备空闲超时 | 负载均衡器或防火墙 | 设备侧主动回收空闲连接 |
| 客户端心跳 | 连接池配置 | 客户端侧确认连接仍可用 |
探测生效需要时间:间隔设置较长时,半开连接会在服务端挂住较久,占用连接槽与内存,故障发现也会滞后。
把 tcp-keepalive 调得极短会让空闲连接频繁发探测包,连接数多时形成额外流量;间隔应与客户端心跳配合,而不是一味求短。