配置项作用 #
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 | 是否启用 keepalive | true |
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,使用系统默认值。需要重启: 修改此配置需要重启节点。
配合使用: 需要与
keep_alive、keep_idle、keep_interval配合。检测时间: keep_count 越大,死连接检测时间越长。
系统差异: 不同系统的默认值不同。
操作系统限制: 受操作系统的 TCP 栈限制。
平台兼容: 使用
-1可以获得最佳平台兼容性。网络环境: 根据网络环境调整配置。
监控建议: 监控连接异常中断情况。
测试验证: 配置变更后应验证连接效果。
与其他 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 ❌





