配置项作用 #
http.tcp.keep_idle 配置项用于控制在连接空闲多长时间后,TCP Keep-Alive 机制开始发送探测包。
这是 TCP Keep-Alive 机制的第一个参数,定义了连接在没有任何数据传输的情况下保持活跃状态的时间,超过这个时间后才会开始发送 Keep-Alive 探测包。
配置项属性 #
- 配置路径:
http.tcp.keep_idle - 数据类型:
Integer(整数,单位:秒) - 默认值:
-1(使用系统默认值) - 最小值:
-1(表示使用系统默认) - 最大值:
300(5分钟) - 是否可选: 是
- 作用域: NodeScope(节点级别)
配置项详解 #
工作机制 #
TCP Keep-Alive 空闲时间流程
连接建立
│
↓
开始传输数据
│
↓
最后一条数据发送
│
↓
连接空闲计时开始
│
├──────────── keep_idle 秒 ────────────┐
│ │
│ 空闲时间结束
│ │
│ ↓
│ 发送第 1 个探测包
│ │
│ 进入 keep_interval 阶段
│
└──────────── 空闲期间收到数据 ────────┐
│
重新开始计时
│
↓
重置空闲计时器
空闲时间与防火墙超时 #
防火墙超时问题
无 Keep-Alive (keep_idle = -1, 系统默认 7200s):
时间: 0s ──────→ 600s ──────→ 1200s
│ │ │
连接建立 防火墙 连接被
超时断开 不可用
有 Keep-Alive (keep_idle = 300s):
时间: 0s ──→ 300s ──→ 300s ──→ 600s ──→ 600s ──→ 900s
│ │ │ │ │ │
连接 空闲 发送 空闲 发送 空闲
建立 计时 探测✅ 计时 探测✅ 计时
│
↓
连接保持活跃
防火墙不会断开
不同空闲时间的策略 #
keep_idle = 30s(短空闲):
优点:
- 快速检测断开连接
- 适合短连接场景
- 减少资源占用
缺点:
- 更频繁的探测包
- 网络流量略增
- 可能误判网络抖动
keep_idle = 300s(中等空闲):
优点:
- 平衡性能和可靠性
- 适合大多数场景
- 防止常见防火墙超时
缺点:
- 检测断开较慢
- 可能占用连接更久
keep_idle = -1(系统默认,通常 7200s):
优点:
- 最少网络开销
- 系统默认行为
缺点:
- 防火墙可能先超时
- 检测断开很慢
- 可能占用僵尸连接
配置建议 #
生产环境(默认) #
http:
tcp:
keep_alive: true
keep_idle: -1 # 使用系统默认
建议: 保持默认值 -1。适用于大多数标准场景。
防火墙限制环境 #
http:
tcp:
keep_alive: true
keep_idle: 60 # 1 分钟
keep_interval: 10
keep_count: 5
建议: 设置为 60-300 秒。当防火墙或其他网络设备有连接超时限制时使用。
云环境配置 #
http:
tcp:
keep_alive: true
keep_idle: 30 # 30 秒
keep_interval: 5
keep_count: 8
建议: 设置为 30-120 秒。云环境的负载均衡器可能有较短的超时。
高频交互应用 #
http:
tcp:
keep_alive: true
keep_idle: 10 # 10 秒
keep_interval: 2
keep_count: 5
建议: 设置为 10-60 秒。应用频繁交互,需要快速检测断开。
代码示例 #
easysearch.yml 基础配置 #
http:
tcp:
keep_alive: true
keep_idle: -1 # 使用系统默认
完整 TCP Keep-Alive 配置 #
http:
tcp:
keep_alive: true
keep_idle: 120
keep_interval: 15
keep_count: 8
跨网络部署配置 #
http:
tcp:
keep_alive: true
keep_idle: 60
keep_interval: 10
keep_count: 5
快速检测配置 #
http:
tcp:
keep_alive: true
keep_idle: 15
keep_interval: 3
keep_count: 3
相关配置 #
| 配置项 | 作用 | 默认值 |
|---|---|---|
http.tcp.keep_alive | 是否启用 Keep-Alive | true |
http.tcp.keep_idle | 空闲等待时间(秒) | -1(系统默认) |
http.tcp.keep_interval | 探测间隔时间(秒) | -1(系统默认) |
http.tcp.keep_count | 探测重试次数 | -1(系统默认) |
系统默认值参考 #
不同操作系统的默认 keep_idle
Linux:
- 默认值: 7200 秒(2 小时)
- 查看命令: cat /proc/sys/net/ipv4/tcp_keepalive_time
- 调整命令: sysctl -w net.ipv4.tcp_keepalive_time=600
macOS:
- 默认值: 7200 秒(2 小时)
- 查看命令: sysctl net.inet.tcp.keepidle
- 调整命令: sysctl -w net.inet.tcp.keepidle=600
Windows:
- 默认值: 通常为 7200000 毫秒(2 小时)
- 查看注册表: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
- 默认值在不同版本可能不同
使用场景 #
推荐使用系统默认的场景 #
- 内网环境: 网络稳定,没有防火墙超时问题
- 短连接: 连接使用时间短,完成后立即关闭
- 标准应用: 没有特殊的网络环境要求
推荐设置较短时间的场景 #
- 云环境: AWS、Azure、阿里云等可能有连接超时
- 跨网络部署: 通过互联网或 VPN 连接
- 防火墙限制: 网络设备有连接超时限制
- 负载均衡器: 通过负载均衡器访问
- 高频应用: 需要快速检测和处理连接断开
推荐设置较长时间的场景 #
- 稳定内网: 数据中心内部,网络极其稳定
- 长连接应用: 连接可能长时间空闲后继续使用
- 减少开销: 希望减少 Keep-Alive 探测包
常见防火墙超时时间 #
典型网络设备的连接超时时间
防火墙:
- 企业防火墙: 60-300 秒(1-5 分钟)
- 云防火墙: 30-120 秒
- 家用路由器: 300-600 秒
负载均衡器:
- AWS ALB: 60 秒(空闲超时)
- Azure LB: 240 秒
- Nginx: 60 秒(默认)
NAT 设备:
- 企业 NAT: 120-300 秒
- 家用 NAT: 300-900 秒
配置建议:
keep_idle 应该小于网络设备的超时时间
通常设置为网络超时的 50-80%
配置调优指南 #
确定合适的 keep_idle #
步骤 1: 检查网络设备超时
查询防火墙、负载均衡器的超时设置
确定最小的超时时间
步骤 2: 设置 keep_idle
keep_idle = 网络超时 × 0.6
例如,防火墙超时 120 秒:
keep_idle = 120 × 0.6 = 72 秒
步骤 3: 测试验证
配置后观察连接稳定性
检查是否还有超时断开问题
根据实际情况调整
步骤 4: 监控和优化
监控连接建立和断开的情况
统计 Keep-Alive 探测的频率
优化配置以平衡性能和可靠性
常见问题排查 #
问题 1: 连接被防火墙断开 #
现象: 长时间空闲后连接无法使用
原因: keep_idle > 防火墙超时
解决: 减小 keep_idle,使其小于防火墙超时
keep_idle: 300 → 60
问题 2: 过多 Keep-Alive 探测 #
现象: 网络中出现大量 Keep-Alive 探测包
原因: keep_idle 设置过小
解决: 增大 keep_idle
keep_idle: 10 → 120
问题 3: 连接断开检测慢 #
现象: 连接断开后长时间未检测到
原因: keep_idle 设置过大
解决: 减小 keep_idle
keep_idle: 7200 → 300
注意事项 #
最大值限制: 配置最大值为 300 秒(5 分钟),超过会被截断。
平台支持: 需要 Linux 或 macOS 平台才能设置此参数。
JDK 版本: Java 11+ 提供了完整的 TCP Keep-Alive 参数支持。
必须启用 keep_alive: 只有在
http.tcp.keep_alive = true时此配置才生效。系统默认优先: 设置为
-1时使用系统默认值,通常是 7200 秒(2 小时)。与防火墙协调: keep_idle 应该小于网络设备的连接超时时间。
配合其他参数: 需要与
keep_interval和keep_count配合使用。总超时计算: 连接断开检测的总时间 =
keep_idle + (keep_interval × keep_count)。动态更新: 此配置不支持动态更新,修改后需要重启节点。
监控建议: 监控连接超时、Keep-Alive 探测频率,评估配置效果。





