配置项作用 #
http.tcp.keep_count 配置项用于控制在判定连接断开之前,TCP Keep-Alive 机制发送探测包的重试次数。
当连接空闲且未收到对 Keep-Alive 探测的响应时,系统会持续发送探测包。此配置指定了在放弃连接并判定为断开之前,最多发送多少个探测包。
配置项属性 #
- 配置路径:
http.tcp.keep_count - 数据类型:
Integer(整数) - 默认值:
-1(使用系统默认值) - 最小值:
-1(表示使用系统默认) - 是否可选: 是
- 作用域: NodeScope(节点级别)
配置项详解 #
工作机制 #
TCP Keep-Alive 探测流程
连接空闲超过 keep_idle 时间
│
↓
发送第 1 个探测包
│
├──────── 收到响应 ✅
│ ↓
│ 连接正常,重置计时器
│
└──────── 未收到响应
↓
等待 keep_interval
↓
发送第 2 个探测包
│
├──────── 收到响应 ✅
│ ↓
│ 连接正常,重置计时器
│
└──────── 未收到响应
↓
等待 keep_interval
↓
发送第 3 个探测包
│
│ ... 重复 ...
│
↓
发送第 keep_count 个探测包
│
├──────── 收到响应 ✅
│ ↓
│ 连接正常,重置计时器
│
└──────── 仍未收到响应 ❌
↓
判定连接断开
↓
关闭连接
探测次数与超时的关系 #
连接断开检测的总时间计算
总超时时间 = keep_idle + (keep_interval × keep_count)
示例 1: 系统默认(不同系统可能不同)
假设:
keep_idle = 7200s (2小时)
keep_interval = 75s
keep_count = 9 (系统默认)
总超时 = 7200 + (75 × 9) = 7875 秒 ≈ 2.2 小时
示例 2: 快速检测配置
keep_idle = 30s
keep_interval = 5s
keep_count = 5
总超时 = 30 + (5 × 5) = 55 秒
示例 3: 云环境配置
keep_idle = 10s
keep_interval = 2s
keep_count = 8
总超时 = 10 + (2 × 8) = 26 秒
不同探测次数的效果 #
keep_count = 3(较少):
探测包: 1 ──→ 2 ──→ 3 ──→ 断开
时间: 快速检测断开
优点: 快速释放资源
缺点: 可能误判(网络抖动时)
keep_count = 8(较多):
探测包: 1 ──→ 2 ──→ ... ──→ 8 ──→ 断开
时间: 较慢检测断开
优点: 更容忍网络抖动
缺点: 较慢释放资源
keep_count = -1(系统默认):
使用操作系统的默认值
- Linux: 通常为 9
- macOS: 通常为 8
- Windows: 通常为 5-10
配置建议 #
生产环境(默认) #
http:
tcp:
keep_alive: true
keep_count: -1 # 使用系统默认
建议: 保持默认值 -1。系统默认值通常适用于大多数场景。
快速故障检测 #
http:
tcp:
keep_alive: true
keep_idle: 30
keep_interval: 5
keep_count: 5
建议: 设置为 5-8。当需要快速检测连接断开时使用。
网络不稳定环境 #
http:
tcp:
keep_alive: true
keep_idle: 60
keep_interval: 10
keep_count: 10
建议: 设置为 10-15。当网络质量不稳定时使用。
云环境配置 #
http:
tcp:
keep_alive: true
keep_idle: 10
keep_interval: 2
keep_count: 8
建议: 设置为 8-12。云环境可能有丢包,需要更多重试。
代码示例 #
easysearch.yml 基础配置 #
http:
tcp:
keep_alive: true
keep_count: -1 # 使用系统默认
完整 TCP Keep-Alive 配置 #
http:
tcp:
keep_alive: true
keep_idle: 60
keep_interval: 10
keep_count: 8
敏感检测配置 #
http:
tcp:
keep_alive: true
keep_idle: 10
keep_interval: 2
keep_count: 3
高可靠性配置 #
http:
tcp:
keep_alive: true
keep_idle: 120
keep_interval: 15
keep_count: 12
相关配置 #
| 配置项 | 作用 | 默认值 |
|---|---|---|
http.tcp.keep_alive | 是否启用 Keep-Alive | true |
http.tcp.keep_idle | 空闲等待时间(秒) | -1(系统默认) |
http.tcp.keep_interval | 探测间隔时间(秒) | -1(系统默认) |
http.tcp.keep_count | 探测重试次数 | -1(系统默认) |
系统默认值参考 #
不同操作系统的默认 keep_count
Linux:
- 默认值: 通常为 9
- 可通过 /proc/sys/net/ipv4/tcp_keepalive_probes 查看
- 可通过 sysctl 调整
macOS:
- 默认值: 通常为 8
- 可通过 sysctl net.inet.tcp.keepcnt 查看
- 可通过 sysctl -w 调整
Windows:
- 默认值: 通常为 5-10
- 可通过注册表调整
- 不同版本可能有差异
当 keep_count = -1 时,使用系统默认值
使用场景 #
推荐使用系统默认的场景 #
- 标准生产环境: 系统默认值通常已经过充分测试
- 稳定网络: 网络质量良好,很少丢包
- 不确定配置值: 不确定应该设置多少时使用默认
推荐设置较小值的场景 #
- 快速故障转移: 需要快速检测连接断开并切换
- 短连接应用: 连接使用时间较短
- 内网环境: 网络稳定,不需要太多重试
推荐设置较大值的场景 #
- 不稳定网络: 网络质量较差,可能丢包
- 跨公网连接: 通过公网访问
- 云环境: 虚拟网络可能有额外的延迟和丢包
- 高可靠性要求: 需要确保连接在真正断开前不被误判
探测失败场景分析 #
场景 1: 网络临时拥塞
时间线:
0s ──→ 1s ──→ 2s ──→ 3s ──→ 4s
│ │ │ │ │
探测1 探测2 探测3 响应✅ 连接恢复
keep_count = 5: 连接正常 ✅
keep_count = 2: 误判断开 ❌
场景 2: 对端崩溃
时间线:
0s ──→ 1s ──→ 2s ──→ 3s ──→ 4s
│ │ │ │ │
探测1 探测2 探测3 探测4 探测5
(无响应)(无响应)(无响应)(无响应)(无响应)
keep_count = 5: 4-5秒后判定断开 ✅
keep_count = 15: 14-15秒后判定断开
场景 3: 防火墙丢弃探测包
时间线:
0s ──→ 2s ──→ 4s ──→ 6s ──→ 8s
│ │ │ │ │
探测1 探测2 探测3 探测4 探测5
(被丢弃)(被丢弃)(被丢弃)(被丢弃)(被丢弃)
keep_count = 5: 8-10秒后判定断开
keep_count = 8: 14-16秒后判定断开
配置调优指南 #
确定合适的 keep_count #
步骤 1: 评估网络质量
优秀: 丢包率 < 0.1%
- keep_count: 3-5
良好: 丢包率 0.1%-1%
- keep_count: 5-8
一般: 丢包率 1%-5%
- keep_count: 8-12
较差: 丢包率 > 5%
- keep_count: 12-15
步骤 2: 计算总超时时间
总超时 = keep_idle + (keep_interval × keep_count)
如果总超时过长,减少 keep_count
如果总超时过短,增加 keep_count
步骤 3: 测试验证
在生产环境测试配置
监控连接断开和误判情况
根据实际情况调整
注意事项 #
系统默认: 默认值为
-1,使用操作系统的默认值。平台支持: 需要运行在支持的平台(Linux、macOS)上。
JDK 版本: Java 11+ 提供了完整的 TCP Keep-Alive 参数支持。
与 keep_idle 配合: 必须设置合理的
keep_idle,此配置才会生效。与 keep_interval 配合:
keep_interval决定了探测包之间的间隔。总超时时间: 连接断开检测的总时间 =
keep_idle + (keep_interval × keep_count)。动态更新: 此配置不支持动态更新,修改后需要重启节点。
网络监控: 监控网络质量,根据实际情况调整配置。
误判风险: 设置过小可能导致网络抖动时误判连接断开。
延迟释放: 设置过大会导致连接断开后长时间才被检测到。





