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

配置项作用 #

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 分钟后关闭连接

配置建议 #

生产环境(默认) #

network:
  tcp:
    keep_count: -1  # 默认值

建议: 保持默认值 -1。使用系统默认值。

高可靠性环境 #

network:
  tcp:
    keep_count: 10  # 增加次数

建议: 设置为 10-20。需要更高可靠性时使用。

快速故障检测 #

network:
  tcp:
    keep_count: 3  # 减少次数

建议: 设置为 3-5。需要快速检测死连接时使用。

标准配置 #

network:
  tcp:
    keep_alive: true
    keep_idle: 300
    keep_interval: 300
    keep_count: -1

建议: 保持 -1。与系统默认一致。

代码示例 #

easysearch.yml 基础配置 #

network:
  tcp:
    keep_count: -1

高可靠性配置 #

network:
  tcp:
    keep_alive: true
    keep_idle: 300
    keep_interval: 300
    keep_count: 15

快速检测配置 #

network:
  tcp:
    keep_alive: true
    keep_idle: 60
    keep_interval: 60
    keep_count: 3

完整 TCP 配置 #

network:
  tcp:
    keep_alive: true
    keep_idle: 300
    keep_interval: 300
    keep_count: -1
    no_delay: true

相关配置 #

配置项作用默认值
network.tcp.keep_alive是否启用 keepalivetrue
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_alivekeep_idlekeep_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 ❌