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

配置项作用 #

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-Alivetrue
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

注意事项 #

  1. 最大值限制: 配置最大值为 300 秒(5 分钟),超过会被截断。

  2. 平台支持: 需要 Linux 或 macOS 平台才能设置此参数。

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

  4. 必须启用 keep_alive: 只有在 http.tcp.keep_alive = true 时此配置才生效。

  5. 系统默认优先: 设置为 -1 时使用系统默认值,通常是 7200 秒(2 小时)。

  6. 与防火墙协调: keep_idle 应该小于网络设备的连接超时时间。

  7. 配合其他参数: 需要与 keep_intervalkeep_count 配合使用。

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

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

  10. 监控建议: 监控连接超时、Keep-Alive 探测频率,评估配置效果。