--- title: "内存断路器 Accounting 限制配置" date: 2026-01-12 lastmod: 2026-01-12 description: "indices.breaker.accounting.limit 配置项用于控制 Accounting 断路器的内存限制。" tags: ["断路器", "内存管理", "Accounting", "内存保护"] summary: "配置项作用 # 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." --- ## 配置项作用 `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 索引段 - 倒排索引 - 存储的文档数据 - 不会自动释放 特点: ├── 长期占用内存 ├── 只能通过删除索引释放 ├── 断路器触发后需要手动恢复 └── 是系统内存的主要组成部分 断路器行为: 触发后: ├── 拒绝新的索引操作 ├── 保护系统不崩溃 └── 需要手动清理内存后恢复 ``` ## 配置建议 ## 生产环境 ```yaml indices: breaker: accounting: limit: 70% # 推荐配置 ``` **建议**: 设置为 `70%-80%`。为系统预留缓冲空间。 ## 开发环境 ```yaml indices: breaker: accounting: limit: 90% # 较高限制 ``` **建议**: 设置为 `80%-90%`。开发环境可以宽松一些。 ## 大内存服务器 ```yaml indices: breaker: accounting: limit: 80GB # 绝对值 ``` **建议**: 使用绝对值。大内存服务器可以使用具体数值。 ## 小内存服务器 ```yaml indices: breaker: accounting: limit: 4GB # 较小限制 ``` **建议**: 使用较小的绝对值。确保有足够内存给其他组件。 ## 代码示例 ## easysearch.yml 基础配置 ```yaml indices: breaker: accounting: limit: 70% ``` ## 使用绝对值配置 ```yaml indices: breaker: accounting: limit: 8gb ``` ## 完整断路器配置 ```yaml indices: breaker: accounting: limit: 70% overhead: 1.0 type: memory ``` ## 动态更新配置 ```json 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. 重启节点 ``` ## 注意事项 1. **默认值风险**: 默认值 `100%` 可能让系统无缓冲。 2. **持久性**: Accounting 断路器是 `PERMANENT` 类型,触发后需手动恢复。 3. **动态更新**: 支持动态更新,修改后立即生效。 4. **预留空间**: 建议设置为 JVM 堆的 70%-80%。 5. **与其他断路器配合**: 需要考虑所有断路器的总限制。 6. **监控重要**: 密切监控 Accounting 内存使用情况。 7. **Lucene 段**: 主要跟踪 Lucene 索引段的内存。 8. **内存泄漏**: 持续增长可能表示内存泄漏。 9. **段合并**: 定期段合并可以减少内存使用。 10. **集群健康**: 断路器触发会影响集群健康状态。