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

配置项作用 #

network.tcp.keep_idle 配置项用于控制TCP 连接在空闲多长时间后开始发送 keepalive 探测包

当连接在指定时间内没有数据传输时,系统会启动 TCP keepalive 机制,开始发送探测包来确认连接是否仍然活跃。

配置项属性 #

  • 配置路径: network.tcp.keep_idle
  • 数据类型: Integer(整数,秒)
  • 默认值: -1(使用系统默认值)
  • 最小值: -1
  • 最大值: 300(5分钟)
  • 是否可选: 是
  • 作用域: NodeScope(节点级别)
  • 动态更新: 否(需要重启节点生效)

配置项详解 #

工作机制 #

TCP Keepalive 空闲检测

连接建立后:

数据传输活跃:
├── 持续有数据
├── keep_idle 计时器重置
└── 不发送探测


连接空闲:

00:00 ──→ 最后一次数据传输
00:01 ──→ 空闲中...
00:02 ──→ 空闲中...
...
05:00 ──→ 达到 keep_idle (300秒)
        ↓
        开始发送 keepalive probe
        ↓
        等待响应...

探测时间线 #

完整 Keepalive 时间线

keep_idle = 300 (5分钟)
keep_interval = 300 (5分钟)
keep_count = 9 (系统默认)


00:00 ──→ 最后一次数据
       ↓
       空闲计时器开始


05:00 ──→ 达到 keep_idle
       ↓
       发送探测 1
       ↓
       等待 keep_interval (300秒)


10:00 ──→ 发送探测 2 (假设无响应)
       ↓
       等待 keep_interval


15:00 ──→ 发送探测 3 (假设无响应)
...
50:00 ──→ 发送探测 9 (假设无响应)
       ↓
       达到 keep_count
       ↓
       关闭连接 ❌


总空闲时间:
= keep_idle + (keep_interval × keep_count)
= 300 + (300 × 9)
= 3000 秒
= 50 分钟

特殊值说明 #

keep_idle 的特殊值

-1 (默认):
├── 使用系统默认值
├── Linux: 通常 7200 秒 (2小时)
├── Windows: 通常 7200 秒 (2小时)
├── macOS: 通常 7200 秒 (2小时)
└── 保持系统默认 ✅


0:
├── 立即开始探测
├── 不等待空闲
└── 可能产生额外开销 ⚠️


正整数 (1-300):
├── 自定义空闲时间(秒)
├── 例如: 60 (1分钟)
├── 例如: 300 (5分钟)
└── 根据网络环境设置

配置建议 #

生产环境(默认) #

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

建议: 保持默认值 -1。使用系统默认值(通常2小时)。

防火墙友好 #

network:
  tcp:
    keep_idle: 300  # 5分钟

建议: 设置为 300。防止防火墙切断空闲连接。

快速检测 #

network:
  tcp:
    keep_idle: 60  # 1分钟

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

标准配置 #

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

建议: 设置为 300(5分钟)。现代网络推荐值。

代码示例 #

easysearch.yml 基础配置 #

network:
  tcp:
    keep_idle: -1

防火墙友好配置 #

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

快速检测配置 #

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

完整 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_idle 设置优点缺点
60快速检测死连接额外网络开销
300防火墙友好标准推荐
600平衡开销和检测中等设置
-1(默认)系统默认2小时较长

网络开销对比 #

不同 keep_idle 的探测频率

keep_idle = 60 (1分钟):

每空闲 1 分钟开始探测
假设 keep_count = 9, keep_interval = 60
每小时空闲连接探测: 约 9 次
网络开销: 低 ✅


keep_idle = 300 (5分钟):

每空闲 5 分钟开始探测
每小时空闲连接探测: 约 1-2 次
网络开销: 很低 ✅


keep_idle = -1 (默认,系统7200秒):

每空闲 2 小时开始探测
每小时空闲连接探测: 约 0 次
网络开销: 极低 ✅

使用场景 #

推荐使用默认值的场景 #

  • 稳定内网: 信任的内网环境
  • 长时间连接: 连接可能长时间空闲
  • 系统默认: 相信系统默认配置

推荐减少空闲时间的场景 #

  • 防火墙环境: 有防火墙可能切断空闲连接
  • 负载均衡: 经过负载均衡器
  • 公网连接: 跨越公网的连接
  • NAT 环境: 经过 NAT 设备

推荐保持系统默认的场景 #

  • 专用网络: 专用的数据中心网络
  • 稳定连接: 网络非常稳定
  • 长期运行: 连接需要保持很长时间

防火墙影响 #

防火墙与 Keepalive

常见问题:

防火墙超时设置:
├── 许多防火墙: 5-15 分钟超时
├── 系统默认: 2 小时
└── 不匹配 → 连接被切断 ❌


解决方案:

keep_idle = 300 (5分钟):
├── 早于防火墙超时
├── 提前发送探测
├── 保持连接活跃
└── 防火墙不会切断 ✅


配置示例:

防火墙超时: 10 分钟
keep_idle: 300 (5分钟)
keep_interval: 300 (5分钟)
确保在防火墙超时前探测 ✅

系统默认值对比 #

不同系统的默认 keep_idle

Linux:
/proc/sys/net/ipv4/tcp_keepalive_time
默认值: 7200 秒 (2小时)
查看: cat /proc/sys/net/ipv4/tcp_keepalive_time


Windows:
默认值: 7200000 毫秒 (2小时)
注册表: TcpIp\Parameters\KeepAliveTime


macOS:
默认值: 7200 秒 (2小时)
sysctl: net.inet.tcp.keepidle


使用 -1:
├── 自动使用系统默认值
├── 跨平台一致
├── 无需手动配置
└── 推荐使用 ✅

注意事项 #

  1. 默认值: 默认值为 -1,使用系统默认值(通常2小时)。

  2. 需要重启: 修改此配置需要重启节点。

  3. 单位是秒: 配置值的单位是秒,不是毫秒。

  4. 最大值限制: 最大值为 300 秒(5分钟)。

  5. 防火墙考虑: 应根据防火墙超时设置调整。

  6. 配合使用: 需要与 keep_intervalkeep_count 配合。

  7. 网络开销: 越小的值会产生更多网络开销。

  8. 平台差异: 不同系统的系统默认值可能不同。

  9. 监控建议: 监控连接异常中断情况。

  10. 测试验证: 配置变更后应验证连接稳定性。

连接保活策略 #

不同环境的 Keepalive 策略

内网环境:
keep_idle: -1
keep_interval: -1
keep_count: -1
├── 使用系统默认
├── 2 小时开始探测
└── 适合稳定内网 ✅


DMZ 环境:
keep_idle: 300
keep_interval: 300
keep_count: 9
├── 5 分钟开始探测
├── 防止防火墙切断
└── 适合 DMZ 环境 ✅


公网环境:
keep_idle: 180
keep_interval: 180
keep_count: 5
├── 3 分钟开始探测
├── 快速检测
└── 适合公网环境 ✅

Java 限制说明 #

Java Socket 的限制

标准 Socket API:
Socket.setKeepAlive(true)
├── 只能启用/禁用
├── 不能设置具体参数
└── 使用系统默认 ✅


Easysearch 实现:
├── 使用 Netty/NIO
├── 直接设置 Socket 选项
├── 支持 TCP_* 参数
└── 可以自定义配置 ✅


平台兼容:
Linux: ✅ 完全支持
Windows: ✅ 完全支持
macOS: ✅ 完全支持
其他: ⚠️ 取决于 JVM 实现