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

配置项作用 #

network.breaker.inflight_requests.limit 配置项用于控制网络层飞行请求(in-flight requests)断路器的内存限制

此断路器专门跟踪和处理网络上进行读写请求时分配的内存,防止网络传输层过度消耗内存导致系统崩溃。

配置项属性 #

  • 配置路径: network.breaker.inflight_requests.limit
  • 数据类型: ByteSizeValue(字节大小值)
  • 默认值: 100%(堆内存的100%)
  • 最小值: 理论上为 0(实际不应设为 0)
  • 是否可选: 是
  • 作用域: NodeScope(节点级别)
  • 动态更新: 是(支持动态更新)

配置项详解 #

工作机制 #

In-Flight Requests 断路器

断路器类型: memory
持久性: TRANSIENT (临时性)
开销因子: 2.0 (默认)


内存跟踪流程:

HTTP 请求到达:
├── 获取 contentLength
├── 注册到断路器
├── 内存使用 += contentLength × overhead
└── 检查是否超过限制


网络传输:
├── 读取数据 → 注册内存
├── 写入数据 → 注册内存
└── 完成后释放内存


断路判断:
if (内存使用 > limit) {
    → 抛出 CircuitBreakingException ❌
    → 拒绝新请求
} else {
    → 继续处理 ✅
}

内存计算 #

实际内存占用计算

请求大小: contentLength
开销因子: overhead (默认 2.0)


估算内存:
estimatedMemory = contentLength × overhead


示例 1:
contentLength = 1MB
overhead = 2.0
estimatedMemory = 1MB × 2.0 = 2MB


示例 2:
contentLength = 10MB
overhead = 2.0
estimatedMemory = 10MB × 2.0 = 20MB


为什么需要 overhead:
├── JVM 对象头
├── 内部数据结构
├── 网络缓冲区
├── 并发访问开销
└── 保守估计确保安全

断路器触发 #

断路触发条件

当前状态:
已用内存: 900MB
限制: 1000MB
overhead: 2.0


新请求:
contentLength: 60MB
estimatedMemory: 60MB × 2.0 = 120MB


判断:
900MB + 120MB = 1020MB > 1000MB
    │
    ↓
触发断路 ❌
    │
    ↓
抛出 CircuitBreakingException
拒绝请求


请求完成后:
释放内存: -estimatedMemory
已用内存: 900MB - 120MB = 780MB
断路器恢复 ✅

配置建议 #

生产环境(默认) #

network:
  breaker:
    inflight_requests:
      limit: 100%  # 默认值

建议: 保持默认值 100%。使用全部堆内存。

内存受限环境 #

network:
  breaker:
    inflight_requests:
      limit: 50%  # 限制为堆内存的一半

建议: 设置为 50-75%。内存紧张时使用。

固定大小限制 #

network:
  breaker:
    inflight_requests:
      limit: 2gb  # 固定 2GB

建议: 设置具体大小。需要精确控制时使用。

严格限制 #

network:
  breaker:
    inflight_requests:
      limit: 25%  # 严格限制

建议: 设置为 25-30%。网络请求很小时使用。

代码示例 #

easysearch.yml 基础配置 #

network:
  breaker:
    inflight_requests:
      limit: 100%
      overhead: 2.0

内存受限配置 #

network:
  breaker:
    inflight_requests:
      limit: 50%
      overhead: 2.0

固定大小配置 #

network:
  breaker:
    inflight_requests:
      limit: 1gb
      overhead: 1.5

动态更新配置 #

PUT /_cluster/settings
{
  "transient": {
    "network.breaker.inflight_requests.limit": "75%"
  }
}

相关配置 #

配置项作用默认值
network.breaker.inflight_requests.limit内存限制100%
network.breaker.inflight_requests.overhead开销因子2.0
indices.breaker.total.limit总断路器限制70%

性能影响分析 #

limit 设置优点缺点
25%安全,内存充裕可能拒绝正常请求
50%较安全中等限制
75%平衡安全和能力标准设置
100%(默认)最大能力无安全边际

并发请求影响 #

假设堆内存 4GB,overhead = 2.0

limit = 100% (4GB):
最大估算内存: 4GB
可处理: 约 2GB 实际数据 (4GB / 2.0)
并发大请求: 20 个 100MB 请求 ✅


limit = 50% (2GB):
最大估算内存: 2GB
可处理: 约 1GB 实际数据 (2GB / 2.0)
并发大请求: 10 个 100MB 请求 ⚠️


limit = 25% (1GB):
最大估算内存: 1GB
可处理: 约 500MB 实际数据 (1GB / 2.0)
并发大请求: 5 个 100MB 请求 ❌

使用场景 #

推荐使用默认值的场景 #

  • 标准应用: 正常的网络请求量
  • 充足内存: 堆内存充足
  • 未知负载: 不确定实际负载时

推荐减少限制的场景 #

  • 内存受限: 堆内存紧张
  • 其他断路器: 有其他重要的断路器
  • 保守策略: 优先保证稳定性

推荐增加限制的场景 #

  • 大文件传输: 需要传输大文件
  • 网络密集: 大量网络操作
  • 充足内存: 内存非常充足

监控建议 #

监控指标

Nodes Stats API:
GET /_nodes/stats/breaker


响应:
{
  "nodes": {
    "breakers": {
      "inflight_requests": {
        "limit_size_in_bytes": 4294967296,
        "limit_size": "4gb",
        "estimated_size_in_bytes": 536870912,
        "estimated_size": "512mb",
        "tripped": 0,
        "overhead": 2.0
      }
    }
  }
}


关注:
├── estimated_size: 当前使用
├── limit_size: 限制大小
├── tripped: 触发次数
└── 使用率: estimated / limit

注意事项 #

  1. 默认值: 默认值为 100%,堆内存的 100%。

  2. 动态更新: 支持动态更新,修改后立即生效。

  3. 百分比计算: 百分比相对于堆内存大小。

  4. overhead 影响: 实际限制要考虑 overhead 因子。

  5. 临时性: 断路器是 TRANSIENT 类型,请求完成后自动恢复。

  6. 配合 overhead: 应与 overhead 配置配合。

  7. 其他断路器: 需要与其他断路器协调配置。

  8. 监控重要: 必须监控断路器触发情况。

  9. 测试验证: 配置变更后应验证请求处理能力。

  10. 合理设置: 根据实际负载合理设置限制。

断路器协调 #

多个断路器的协调

inflight_requests (100%):
├── 网络层内存
├── 读写请求
└── 临时占用


parent (total):
├── 父级断路器
├── 控制总内存
└── 通常 70%


协调原则:
├── 子断路器之和不应超过父断路器
├── inflight_requests 占用一部分
├── 其他断路器占用剩余部分
└── 防止超额分配