--- title: "TCP Keepalive 探测次数配置" date: 2026-01-26 lastmod: 2026-01-26 description: "network.tcp.keep_count 配置项用于控制 TCP keepalive 探测包的发送次数。" tags: ["网络", "TCP", "Keepalive", "连接保活"] summary: "配置项作用 # network.tcp.keep_count 配置项用于控制TCP keepalive 机制中探测包的最大发送次数。 当启用 TCP keepalive 后,如果连接在指定时间内没有收到响应,系统会发送 keepalive probe。此配置决定了在放弃连接之前最多发送多少个探测包。 配置项属性 # 配置路径: network.tcp.keep_count 数据类型: Integer(整数) 默认值: -1(使用系统默认值) 最小值: -1 最大值: 无明确上限 是否可选: 是 作用域: NodeScope(节点级别) 动态更新: 否(需要重启节点生效) 配置项详解 # 工作机制 # TCP Keepalive 探测流程 连接空闲: ├── 经过 keep_idle 时间 ├── 开始发送探测包 └── 每次间隔 keep_interval 探测序列: 探测 1: ├── 发送: keepalive probe ├── 等待响应 ├── 收到响应 → 连接正常 ✅ └── 重置空闲计时器 探测 2 (无响应): ├── 发送: keepalive probe ├── 等待响应 ├── 无响应 → 继续 ⏸ └── 计数 +1 探测 3 (无响应): ├── 发送: keepalive probe ├── 等待响应 ├── 无响应 → 继续 ⏸ └── 计数 +1 ." --- ## 配置项作用 `network.tcp.keep_count` 配置项用于控制**TCP keepalive 机制中探测包的最大发送次数**。 当启用 TCP keepalive 后,如果连接在指定时间内没有收到响应,系统会发送 keepalive probe。此配置决定了在放弃连接之前最多发送多少个探测包。 ## 配置项属性 - **配置路径**: `network.tcp.keep_count` - **数据类型**: `Integer`(整数) - **默认值**: `-1`(使用系统默认值) - **最小值**: `-1` - **最大值**: 无明确上限 - **是否可选**: 是 - **作用域**: NodeScope(节点级别) - **动态更新**: 否(需要重启节点生效) ## 配置项详解 ## 工作机制 ``` TCP Keepalive 探测流程 连接空闲: ├── 经过 keep_idle 时间 ├── 开始发送探测包 └── 每次间隔 keep_interval 探测序列: 探测 1: ├── 发送: keepalive probe ├── 等待响应 ├── 收到响应 → 连接正常 ✅ └── 重置空闲计时器 探测 2 (无响应): ├── 发送: keepalive probe ├── 等待响应 ├── 无响应 → 继续 ⏸ └── 计数 +1 探测 3 (无响应): ├── 发送: keepalive probe ├── 等待响应 ├── 无响应 → 继续 ⏸ └── 计数 +1 ... 探测 N (达到 keep_count): ├── 发送: keepalive probe ├── 等待响应 ├── 无响应 → 达到上限 ❌ └── 关闭连接 ``` ## 特殊值含义 ``` keep_count 的特殊值 -1 (默认): ├── 使用系统默认值 ├── Linux: 通常 7-9 次 ├── Windows: 通常 10 次 └── 推荐使用 ✅ 0: ├── 立即放弃连接 ├── 不发送探测包 └── 不推荐 ❌ 正整数: ├── 自定义探测次数 ├── 例如: 5, 10, 20 └── 根据需求设置 ``` ## Keepalive 参数关系 ``` 完整的 Keepalive 配置 network.tcp.keep_alive: true (启用) │ ├── keep_idle: 300 (空闲 5 分钟后开始) │ ├── keep_interval: 300 (每次间隔 5 秒) │ └── keep_count: -1 (最多 9 次,系统默认) 总超时时间计算: 假设 keep_idle = 300, keep_interval = 300, keep_count = 9: 空闲时间: 300 秒 (5 分钟) 探测间隔: 300 秒 (5 分钟) 探测次数: 9 次 总超时: = 300 + (300 × 9) = 300 + 2700 = 3000 秒 = 50 分钟 连接在没有数据的情况下: ├── 5 分钟后开始探测 ├── 每 5 分钟探测一次 ├── 最多探测 9 次 └── 50 分钟后关闭连接 ``` ## 配置建议 ## 生产环境(默认) ```yaml network: tcp: keep_count: -1 # 默认值 ``` **建议**: 保持默认值 `-1`。使用系统默认值。 ## 高可靠性环境 ```yaml network: tcp: keep_count: 10 # 增加次数 ``` **建议**: 设置为 `10-20`。需要更高可靠性时使用。 ## 快速故障检测 ```yaml network: tcp: keep_count: 3 # 减少次数 ``` **建议**: 设置为 `3-5`。需要快速检测死连接时使用。 ## 标准配置 ```yaml network: tcp: keep_alive: true keep_idle: 300 keep_interval: 300 keep_count: -1 ``` **建议**: 保持 `-1`。与系统默认一致。 ## 代码示例 ## easysearch.yml 基础配置 ```yaml network: tcp: keep_count: -1 ``` ## 高可靠性配置 ```yaml network: tcp: keep_alive: true keep_idle: 300 keep_interval: 300 keep_count: 15 ``` ## 快速检测配置 ```yaml network: tcp: keep_alive: true keep_idle: 60 keep_interval: 60 keep_count: 3 ``` ## 完整 TCP 配置 ```yaml network: tcp: keep_alive: true keep_idle: 300 keep_interval: 300 keep_count: -1 no_delay: true ``` ## 相关配置 | 配置项 | 作用 | 默认值 | |--------|------|--------| | `network.tcp.keep_alive` | 是否启用 keepalive | true | | `network.tcp.keep_idle` | 空闲时间(秒) | -1 (2小时) | | `network.tcp.keep_interval` | 探测间隔(秒) | -1 | | `network.tcp.keep_count` | 探测次数 | -1 | ## 性能影响分析 | keep_count 设置 | 优点 | 缺点 | |-----------------|------|------| | 3-5 | 快速检测死连接 | 可能误判 | | -1(默认) | 系统默认 | 标准设置 | | 10-20 | 高可靠性 | 检测时间较长 | | 0 | 立即关闭 | 失去 keepalive 作用 | ## 检测时间对比 ``` 不同 keep_count 的检测时间 假设 keep_idle = 300, keep_interval = 300 keep_count = 3: 空闲时间: 300 秒 探测时间: 300 × 3 = 900 秒 总检测: 1200 秒 (20 分钟) ✅ keep_count = -1 (默认,假设系统为 9): 空闲时间: 300 秒 探测时间: 300 × 9 = 2700 秒 总检测: 3000 秒 (50 分钟) keep_count = 15: 空闲时间: 300 秒 探测时间: 300 × 15 = 4500 秒 总检测: 4800 秒 (80 分钟) ⚠️ ``` ## 使用场景 ## 推荐使用默认值的场景 - **标准环境**: 正常的网络环境 - **系统默认**: 相信系统默认值 - **生产环境**: 大多数生产环境 ## 推荐增加次数的场景 - **不稳定网络**: 网络质量不稳定 - **高延迟网络**: 跨区域连接 - **关键连接**: 连接非常重要 - **防火墙环境**: 经过多个防火墙 ## 推荐减少次数的场景 - **快速恢复**: 需要快速清理死连接 - **资源受限**: 连接资源有限 - **稳定网络**: 网络非常稳定 ## Keepalive 机制 ``` 为什么需要 Keepalive 问题场景: 1. 防火墙切断: ├── 连接长时间空闲 ├── 防火墙认为是死连接 └── 切断连接 2. 对端崩溃: ├── 对端程序崩溃 ├── 没有发送 FIN 包 └── 连接半开 3. 网络中断: ├── 网络设备故障 ├── 路由变化 └── 连接中断 Keepalive 解决: ├── 定期发送探测包 ├── 检测连接状态 ├── 及时发现死连接 └── 释放资源 ``` ## 系统默认值 ``` 不同系统的默认 keep_count Linux: /proc/sys/net/ipv4/tcp_keepalive_probes 默认值: 9 可调整: echo 10 > /proc/sys/net/ipv4/tcp_keepalive_probes Windows: 默认值: 10 注册表位置: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters macOS: 默认值: 8 sysctl net.inet.tcp.keepcnt 使用 -1: ├── 自动使用系统默认值 ├── 不需要手动设置 └── 跨平台兼容 ✅ ``` ## 注意事项 1. **默认值**: 默认值为 `-1`,使用系统默认值。 2. **需要重启**: 修改此配置需要重启节点。 3. **配合使用**: 需要与 `keep_alive`、`keep_idle`、`keep_interval` 配合。 4. **检测时间**: keep_count 越大,死连接检测时间越长。 5. **系统差异**: 不同系统的默认值不同。 6. **操作系统限制**: 受操作系统的 TCP 栈限制。 7. **平台兼容**: 使用 `-1` 可以获得最佳平台兼容性。 8. **网络环境**: 根据网络环境调整配置。 9. **监控建议**: 监控连接异常中断情况。 10. **测试验证**: 配置变更后应验证连接效果。 ## 与其他 Keepalive 配置的配合 ``` 完整的 Keepalive 配置策略 配置组 1: 标准配置 keep_alive: true keep_idle: -1 keep_interval: -1 keep_count: -1 └── 全部使用系统默认 ✅ 配置组 2: 快速检测 keep_alive: true keep_idle: 60 keep_interval: 60 keep_count: 3 └── 15 分钟后检测 ✅ 配置组 3: 高可靠性 keep_alive: true keep_idle: 300 keep_interval: 300 keep_count: 20 └── 175 分钟后检测 ⚠️ 配置组 4: 不推荐 keep_alive: false └── 完全禁用 keepalive ❌ ```