--- title: "HTTP TCP Keep-Alive 探测间隔配置" date: 2026-01-28 lastmod: 2026-01-28 description: "http.tcp.keep_interval 配置项用于控制 TCP Keep-Alive 探测包之间的发送间隔时间。" tags: ["HTTP", "TCP", "Keep-Alive", "网络连接"] summary: "配置项作用 # http.tcp.keep_interval 配置项用于控制TCP Keep-Alive 探测包之间的发送间隔时间。 当连接空闲超过 keep_idle 时间后,Keep-Alive 机制开始发送探测包。如果探测包未收到响应,系统会按照此配置指定的时间间隔继续发送后续的探测包。 配置项属性 # 配置路径: http.tcp.keep_interval 数据类型: Integer(整数,单位:秒) 默认值: -1(使用系统默认值) 最小值: -1(表示使用系统默认) 最大值: 300(5分钟) 是否可选: 是 作用域: NodeScope(节点级别) 配置项详解 # 工作机制 # TCP Keep-Alive 探测间隔流程 连接空闲超过 keep_idle │ ↓ 发送第 1 个探测包 │ ├──────── 收到响应 ✅ │ ↓ │ 连接正常,重置计时器 │ └──────── 未收到响应 ↓ 等待 keep_interval 秒 ↓ 发送第 2 个探测包 │ ├──────── 收到响应 ✅ │ ↓ │ 连接正常,重置计时器 │ └──────── 未收到响应 ↓ 等待 keep_interval 秒 ↓ 发送第 3 个探测包 │ │ ." --- ## 配置项作用 `http.tcp.keep_interval` 配置项用于控制**TCP Keep-Alive 探测包之间的发送间隔时间**。 当连接空闲超过 `keep_idle` 时间后,Keep-Alive 机制开始发送探测包。如果探测包未收到响应,系统会按照此配置指定的时间间隔继续发送后续的探测包。 ## 配置项属性 - **配置路径**: `http.tcp.keep_interval` - **数据类型**: `Integer`(整数,单位:秒) - **默认值**: `-1`(使用系统默认值) - **最小值**: `-1`(表示使用系统默认) - **最大值**: `300`(5分钟) - **是否可选**: 是 - **作用域**: NodeScope(节点级别) ## 配置项详解 ## 工作机制 ``` TCP Keep-Alive 探测间隔流程 连接空闲超过 keep_idle │ ↓ 发送第 1 个探测包 │ ├──────── 收到响应 ✅ │ ↓ │ 连接正常,重置计时器 │ └──────── 未收到响应 ↓ 等待 keep_interval 秒 ↓ 发送第 2 个探测包 │ ├──────── 收到响应 ✅ │ ↓ │ 连接正常,重置计时器 │ └──────── 未收到响应 ↓ 等待 keep_interval 秒 ↓ 发送第 3 个探测包 │ │ ... 循环 ... │ ↓ 发送第 keep_count 个探测包 │ ├──────── 收到响应 ✅ │ ↓ │ 连接正常,重置计时器 │ └──────── 仍未收到响应 ❌ ↓ 判定连接断开 ``` ## 探测间隔时间的影响 ``` keep_interval = 5s(短间隔): 探测时间线: 0s ──→ 5s ──→ 10s ──→ 15s ──→ 20s │ │ │ │ │ 探测1 等待 探测2 等待 探测3 优点: 快速检测断开 缺点: 更多网络流量 keep_interval = 60s(长间隔): 探测时间线: 0s ────→ 60s ────→ 120s ────→ 180s │ │ │ │ 探测1 等待 探测2 等待 优点: 减少网络流量 缺点: 检测断开较慢 ``` ## 总超时时间计算 ``` 连接断开检测的总时间 总超时 = keep_idle + (keep_interval × keep_count) 示例 1: 快速检测配置 keep_idle = 10s keep_interval = 2s keep_count = 5 总超时 = 10 + (2 × 5) = 20 秒 示例 2: 标准配置 keep_idle = 60s keep_interval = 10s keep_count = 5 总超时 = 60 + (10 × 5) = 110 秒 示例 3: 云环境配置 keep_idle = 30s keep_interval = 5s keep_count = 8 总超时 = 30 + (5 × 8) = 70 秒 ``` ## 配置建议 ## 生产环境(默认) ```yaml http: tcp: keep_alive: true keep_interval: -1 # 使用系统默认 ``` **建议**: 保持默认值 `-1`。系统默认值通常适用于大多数场景。 ## 快速故障检测 ```yaml http: tcp: keep_alive: true keep_idle: 30 keep_interval: 5 keep_count: 5 ``` **建议**: 设置为 5-15 秒。当需要快速检测连接断开时使用。 ## 不稳定网络环境 ```yaml http: tcp: keep_alive: true keep_idle: 60 keep_interval: 15 keep_count: 8 ``` **建议**: 设置为 15-30 秒。当网络质量不稳定时使用。 ## 云环境配置 ```yaml http: tcp: keep_alive: true keep_idle: 20 keep_interval: 3 keep_count: 10 ``` **建议**: 设置为 3-10 秒。云环境可能需要更频繁的探测。 ## 代码示例 ## easysearch.yml 基础配置 ```yaml http: tcp: keep_alive: true keep_interval: -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: 20 keep_count: 10 ``` ## 相关配置 | 配置项 | 作用 | 默认值 | |--------|------|--------| | `http.tcp.keep_alive` | 是否启用 Keep-Alive | true | | `http.tcp.keep_idle` | 空闲等待时间(秒) | -1(系统默认) | | `http.tcp.keep_interval` | 探测间隔时间(秒) | -1(系统默认) | | `http.tcp.keep_count` | 探测重试次数 | -1(系统默认) | ## 系统默认值参考 ``` 不同操作系统的默认 keep_interval Linux: - 默认值: 75 秒 - 查看命令: cat /proc/sys/net/ipv4/tcp_keepalive_intvl - 调整命令: sysctl -w net.ipv4.tcp_keepalive_intvl=15 macOS: - 默认值: 75 秒 - 查看命令: sysctl net.inet.tcp.keepintvl - 调整命令: sysctl -w net.inet.tcp.keepintvl=15 Windows: - 默认值: 通常为 1000 毫秒(1 秒) - 可通过注册表调整 - 默认值在不同版本可能不同 当 keep_interval = -1 时,使用系统默认值 ``` ## 使用场景 ## 推荐使用系统默认的场景 - **标准生产环境**: 系统默认值通常已经过充分测试 - **稳定网络**: 网络质量良好,延迟较低 - **不确定配置值**: 不确定应该设置多少时使用默认 ## 推荐设置较短间隔的场景 - **快速故障转移**: 需要快速检测连接断开 - **实时性要求高**: 应用对延迟敏感 - **云环境**: 虚拟网络可能有额外的变化 ## 推荐设置较长间隔的场景 - **带宽受限**: 希望减少 Keep-Alive 探测包数量 - **大规模部署**: 节点数量多,需要控制网络流量 - **稳定内网**: 网络环境极其稳定 ## 探测间隔调优 ## 确定合适的 keep_interval ``` 步骤 1: 计算总超时时间 总超时 = keep_idle + (keep_interval × keep_count) 确定应用能接受的最大超时时间 步骤 2: 固定其他参数 通常 keep_count 较为固定(如 5-8) keep_idle 根据网络设备超时设置 步骤 3: 计算 keep_interval keep_interval = (总超时 - keep_idle) / keep_count 例如,希望总超时 60 秒: keep_idle = 30, keep_count = 5 keep_interval = (60 - 30) / 5 = 6 秒 步骤 4: 测试验证 在实际环境中测试 监控连接断开检测时间 根据实际情况调整 ``` ## 网络流量分析 ``` Keep-Alive 探测包流量 假设配置: keep_idle = 60s keep_interval = 10s keep_count = 5 每小时流量计算: 场景 1: 连接正常(第一次探测收到响应) 每 60 秒发送 1 个探测包 每小时 = 3600 / 60 = 60 个探测包 探测包大小 ≈ 40 bytes 总流量 ≈ 60 × 40 = 2400 bytes/hour 场景 2: 连接断开(所有探测都失败) 每 60 秒 + (5 × 10) = 110 秒一个周期 每小时 ≈ 3600 / 110 ≈ 33 个周期 每个周期 = 5 个探测包 总探测包 ≈ 33 × 5 = 165 个 总流量 ≈ 165 × 40 = 6600 bytes/hour ``` ## 常见问题排查 ## 问题 1: 连接断开检测过慢 ``` 现象: 连接断开后很长时间才检测到 原因: keep_interval 设置过大 解决: 减小 keep_interval keep_interval: 60 → 10 ``` ## 问题 2: 过多 Keep-Alive 流量 ``` 现象: 网络中出现大量 Keep-Alive 探测包 原因: keep_interval 设置过小 解决: 增大 keep_interval keep_interval: 2 → 15 ``` ## 问题 3: 误判网络抖动 ``` 现象: 网络暂时抖动被误判为连接断开 原因: keep_interval 过小,keep_count 也较小 解决: 增大 keep_interval 和 keep_count keep_interval: 3 → 10 keep_count: 3 → 8 ``` ## 注意事项 1. **最大值限制**: 配置最大值为 300 秒(5 分钟)。 2. **平台支持**: 需要 Linux 或 macOS 平台才能设置此参数。 3. **JDK 版本**: Java 11+ 提供了完整的 TCP Keep-Alive 参数支持。 4. **必须启用 keep_alive**: 只有在 `http.tcp.keep_alive = true` 时此配置才生效。 5. **与 keep_count 配合**: 两者共同决定了连接断开检测的总时间。 6. **网络流量**: 较小的间隔会产生更多的探测包和网络流量。 7. **总超时计算**: 连接断开检测的总时间 = `keep_idle + (keep_interval × keep_count)`。 8. **动态更新**: 此配置不支持动态更新,修改后需要重启节点。 9. **系统默认优先**: 设置为 `-1` 时使用系统默认值(Linux/macOS 通常为 75 秒)。 10. **监控建议**: 监控 Keep-Alive 探测的频率和连接断开检测时间,评估配置效果。