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

配置项作用 #

indices.breaker.accounting.limit 配置项用于控制Accounting 断路器的内存使用限制

Accounting 断路器用于跟踪与请求生命周期无关的持久化内存使用,主要是 Lucene 索引段(segments)占用的内存。

配置项属性 #

  • 配置路径: indices.breaker.accounting.limit
  • 数据类型: ByteSizeValue(内存大小值)
  • 默认值: 100%(JVM 堆内存的 100%)
  • 是否可选: 是
  • 作用域: NodeScope(节点级别)
  • 动态更新: 是(支持动态更新)

配置项详解 #

工作机制 #

Accounting 断路器内存跟踪

Lucene 索引操作
    │
    ↓
创建/合并索引段
    │
    ↓
内存分配
    │
    ↓
Accounting 断路器跟踪
    │
    ├──── 内存 < limit ──→ 继续操作 ✅
    │
    └──── 内存 ≥ limit ──→ 触发断路 ❌
                              │
                              ↓
                         拒绝分配
                              │
                              ↓
                         返回错误

Accounting 断路器特点 #

与其他断路器的区别

Accounting 断路器:
跟踪: Lucene 段内存
持久性: PERMANENT(持久化)
特点: 请求完成后不释放
类型: 长期内存


Request 断路器:
跟踪: 单个请求的内存
持久性: TRANSIENT(临时)
特点: 请求完成后释放
类型: 短期内存


Field data 断路器:
跟踪: 字段缓存内存
持久性: TRANSIENT(临时)
特点: 可清除缓存
类型: 缓存内存

持久性说明 #

Durability.PERMANENT 含义

持久化内存:
- Lucene 索引段
- 倒排索引
- 存储的文档数据
- 不会自动释放

特点:
├── 长期占用内存
├── 只能通过删除索引释放
├── 断路器触发后需要手动恢复
└── 是系统内存的主要组成部分

断路器行为:
触发后:
├── 拒绝新的索引操作
├── 保护系统不崩溃
└── 需要手动清理内存后恢复

配置建议 #

生产环境 #

indices:
  breaker:
    accounting:
      limit: 70%  # 推荐配置

建议: 设置为 70%-80%。为系统预留缓冲空间。

开发环境 #

indices:
  breaker:
    accounting:
      limit: 90%  # 较高限制

建议: 设置为 80%-90%。开发环境可以宽松一些。

大内存服务器 #

indices:
  breaker:
    accounting:
      limit: 80GB  # 绝对值

建议: 使用绝对值。大内存服务器可以使用具体数值。

小内存服务器 #

indices:
  breaker:
    accounting:
      limit: 4GB  # 较小限制

建议: 使用较小的绝对值。确保有足够内存给其他组件。

代码示例 #

easysearch.yml 基础配置 #

indices:
  breaker:
    accounting:
      limit: 70%

使用绝对值配置 #

indices:
  breaker:
    accounting:
      limit: 8gb

完整断路器配置 #

indices:
  breaker:
    accounting:
      limit: 70%
      overhead: 1.0
      type: memory

动态更新配置 #

PUT /_cluster/settings
{
  "transient": {
    "indices.breaker.accounting.limit": "80%"
  }
}

相关配置 #

配置项作用默认值
indices.breaker.accounting.limitAccounting 内存限制100%
indices.breaker.accounting.overhead内存估算开销系数1.0
indices.breaker.accounting.type断路器类型memory
indices.breaker.total.limit所有断路器总限制70%

配置值格式 #

支持的配置格式

百分比(推荐):
70%    ──→ JVM 堆的 70%
80%    ──→ JVM 堆的 80%
100%   ──→ JVM 堆的 100%(默认)

绝对值:
512mb  ──→ 512 MB
1gb    ──→ 1 GB
8gb    ──→ 8 GB

混合使用(不推荐):
可以混合使用百分比和绝对值
但建议统一使用一种格式

内存使用分析 #

Accounting 内存组成

Lucene 索引段:
├── 倒排索引
├── 存储的字段数据
├── 词项字典
├── 归一化数据
└── 向量空间

估算:
每个段约占 10-50 KB
加上开销: 15-75 KB

大量小段会占用较多内存
合并后可以减少段数量

使用场景 #

推荐使用百分比的场景 #

  • 标准 JVM: 固定大小的 JVM 堆
  • 弹性扩展: 节点内存可能变化
  • 简化配置: 百分比更容易理解

推荐使用绝对值的场景 #

  • 固定硬件: 内存固定的服务器
  • 精确控制: 需要精确控制内存使用
  • 多租户环境: 需要限制各租户内存

推荐限制使用的场景 #

  • 内存受限: 服务器内存有限
  • 稳定性优先: 避免内存耗尽
  • 生产环境: 需要预留缓冲空间

断路器触发处理 #

断路器触发后的处理

触发条件:
accounting 内存 ≥ limit

触发后果:
├── 拒绝新的索引操作
├── 返回 CircuitBreakingError
└── 保护系统不崩溃

恢复步骤:
1. 检查内存使用情况
2. 删除不必要的索引
3. 强制合并段
4. 重启节点

注意事项 #

  1. 默认值风险: 默认值 100% 可能让系统无缓冲。

  2. 持久性: Accounting 断路器是 PERMANENT 类型,触发后需手动恢复。

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

  4. 预留空间: 建议设置为 JVM 堆的 70%-80%。

  5. 与其他断路器配合: 需要考虑所有断路器的总限制。

  6. 监控重要: 密切监控 Accounting 内存使用情况。

  7. Lucene 段: 主要跟踪 Lucene 索引段的内存。

  8. 内存泄漏: 持续增长可能表示内存泄漏。

  9. 段合并: 定期段合并可以减少内存使用。

  10. 集群健康: 断路器触发会影响集群健康状态。