📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

配置项作用 #

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-Alivetrue
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. 系统默认: 默认值为 -1,使用操作系统的默认值。

  2. 平台支持: 需要运行在支持的平台(Linux、macOS)上。

  3. JDK 版本: Java 11+ 提供了完整的 TCP Keep-Alive 参数支持。

  4. 与 keep_idle 配合: 必须设置合理的 keep_idle,此配置才会生效。

  5. 与 keep_interval 配合: keep_interval 决定了探测包之间的间隔。

  6. 总超时时间: 连接断开检测的总时间 = keep_idle + (keep_interval × keep_count)

  7. 动态更新: 此配置不支持动态更新,修改后需要重启节点。

  8. 网络监控: 监控网络质量,根据实际情况调整配置。

  9. 误判风险: 设置过小可能导致网络抖动时误判连接断开。

  10. 延迟释放: 设置过大会导致连接断开后长时间才被检测到。