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

配置项作用 #

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 秒

配置建议 #

生产环境(默认) #

http:
  tcp:
    keep_alive: true
    keep_interval: -1  # 使用系统默认

建议: 保持默认值 -1。系统默认值通常适用于大多数场景。

快速故障检测 #

http:
  tcp:
    keep_alive: true
    keep_idle: 30
    keep_interval: 5
    keep_count: 5

建议: 设置为 5-15 秒。当需要快速检测连接断开时使用。

不稳定网络环境 #

http:
  tcp:
    keep_alive: true
    keep_idle: 60
    keep_interval: 15
    keep_count: 8

建议: 设置为 15-30 秒。当网络质量不稳定时使用。

云环境配置 #

http:
  tcp:
    keep_alive: true
    keep_idle: 20
    keep_interval: 3
    keep_count: 10

建议: 设置为 3-10 秒。云环境可能需要更频繁的探测。

代码示例 #

easysearch.yml 基础配置 #

http:
  tcp:
    keep_alive: true
    keep_interval: -1  # 使用系统默认

完整 TCP Keep-Alive 配置 #

http:
  tcp:
    keep_alive: true
    keep_idle: 60
    keep_interval: 10
    keep_count: 8

敏感检测配置 #

http:
  tcp:
    keep_alive: true
    keep_idle: 10
    keep_interval: 2
    keep_count: 3

高可靠性配置 #

http:
  tcp:
    keep_alive: true
    keep_idle: 120
    keep_interval: 20
    keep_count: 10

相关配置 #

配置项作用默认值
http.tcp.keep_alive是否启用 Keep-Alivetrue
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 探测的频率和连接断开检测时间,评估配置效果。