--- title: "HTTP TCP Keep-Alive 探测次数配置" date: 2026-03-24 lastmod: 2026-03-24 description: "http.tcp.keep_count 配置项用于控制 TCP Keep-Alive 探测失败后的重试次数。" tags: ["HTTP", "TCP", "Keep-Alive", "网络连接"] summary: "配置项作用 # 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 个探测包 │ │ ." --- ## 配置项作用 `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 ``` ## 配置建议 ## 生产环境(默认) ```yaml http: tcp: keep_alive: true keep_count: -1 # 使用系统默认 ``` **建议**: 保持默认值 `-1`。系统默认值通常适用于大多数场景。 ## 快速故障检测 ```yaml http: tcp: keep_alive: true keep_idle: 30 keep_interval: 5 keep_count: 5 ``` **建议**: 设置为 5-8。当需要快速检测连接断开时使用。 ## 网络不稳定环境 ```yaml http: tcp: keep_alive: true keep_idle: 60 keep_interval: 10 keep_count: 10 ``` **建议**: 设置为 10-15。当网络质量不稳定时使用。 ## 云环境配置 ```yaml http: tcp: keep_alive: true keep_idle: 10 keep_interval: 2 keep_count: 8 ``` **建议**: 设置为 8-12。云环境可能有丢包,需要更多重试。 ## 代码示例 ## easysearch.yml 基础配置 ```yaml http: tcp: keep_alive: true keep_count: -1 # 使用系统默认 ``` ## 完整 TCP Keep-Alive 配置 ```yaml http: tcp: keep_alive: true keep_idle: 60 keep_interval: 10 keep_count: 8 ``` ## 敏感检测配置 ```yaml http: tcp: keep_alive: true keep_idle: 10 keep_interval: 2 keep_count: 3 ``` ## 高可靠性配置 ```yaml 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. **系统默认**: 默认值为 `-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. **延迟释放**: 设置过大会导致连接断开后长时间才被检测到。