配置项作用 #
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.limit | Accounting 内存限制 | 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. 重启节点
注意事项 #
默认值风险: 默认值
100%可能让系统无缓冲。持久性: Accounting 断路器是
PERMANENT类型,触发后需手动恢复。动态更新: 支持动态更新,修改后立即生效。
预留空间: 建议设置为 JVM 堆的 70%-80%。
与其他断路器配合: 需要考虑所有断路器的总限制。
监控重要: 密切监控 Accounting 内存使用情况。
Lucene 段: 主要跟踪 Lucene 索引段的内存。
内存泄漏: 持续增长可能表示内存泄漏。
段合并: 定期段合并可以减少内存使用。
集群健康: 断路器触发会影响集群健康状态。





