--- title: "索引压力内存限制配置" date: 2026-01-28 lastmod: 2026-01-28 description: "控制索引操作内存使用限制和反压机制的配置说明" tags: ["内存管理", "索引配置", "压力控制"] summary: "配置项概述 # indexing_pressure.memory.limit 配置控制索引操作可以使用的最大内存量。当内存使用超过限制时,系统会拒绝新的索引请求以防止节点因内存不足而变得不稳定。 配置项 默认值 说明 indexing_pressure.memory.limit 10% 索引操作内存限制 配置说明 # indexing_pressure.memory.limit # 配置项作用:控制索引操作可以使用的最大堆内存比例或绝对大小。 默认值:10%(堆内存的 10%) 配置类型:节点级配置(可动态更新) 取值范围: 百分比:如 10%, 25%, 50% 绝对大小:如 100mb, 1gb, 512kb 配置格式: # 默认配置:使用百分比 indexing_pressure.memory.limit: 10% # 使用绝对大小 indexing_pressure.memory.limit: 1gb # 高吞吐场景 indexing_pressure.memory.limit: 25% # 内存受限环境 indexing_pressure.memory.limit: 5% 内存跟踪机制 # 索引压力系统跟踪三个类别的内存使用: 1. 协调器 + 主分片操作 # 限制:indexing_pressure." --- ## 配置项概述 `indexing_pressure.memory.limit` 配置控制索引操作可以使用的最大内存量。当内存使用超过限制时,系统会拒绝新的索引请求以防止节点因内存不足而变得不稳定。 | 配置项 | 默认值 | 说明 | |--------|--------|------| | `indexing_pressure.memory.limit` | 10% | 索引操作内存限制 | --- ## 配置说明 ## indexing_pressure.memory.limit **配置项作用**:控制索引操作可以使用的最大堆内存比例或绝对大小。 **默认值**:`10%`(堆内存的 10%) **配置类型**:节点级配置(可动态更新) **取值范围**: - **百分比**:如 `10%`, `25%`, `50%` - **绝对大小**:如 `100mb`, `1gb`, `512kb` **配置格式**: ```yaml # 默认配置:使用百分比 indexing_pressure.memory.limit: 10% # 使用绝对大小 indexing_pressure.memory.limit: 1gb # 高吞吐场景 indexing_pressure.memory.limit: 25% # 内存受限环境 indexing_pressure.memory.limit: 5% ``` --- ## 内存跟踪机制 索引压力系统跟踪三个类别的内存使用: ## 1. 协调器 + 主分片操作 - **限制**:`indexing_pressure.memory.limit` - **跟踪内容**:协调节点和主分片写入的内存使用 - **内存类型**:合并跟踪协调和主分片操作的内存 ## 2. 副本操作 - **限制**:`indexing_pressure.memory.limit × 1.5` - **跟踪内容**:副本写入的内存使用 - **原因**:副本写入与主分片写入同时进行,需要更高的限制 ## 3. 组合限制 ``` ┌──────────────────────────────────────────────┐ │ 索引压力内存限制 │ ├──────────────────┬───────────────────────────┤ │ 协调+主分片 │ 副本操作 │ │ limit: 10% │ limit: 10% × 1.5 = 15% │ │ │ │ │ 当前使用: 8% │ 当前使用: 12% │ └──────────────────┴───────────────────────────┘ ``` --- ## 工作原理 ## 内存跟踪 ```java // 系统持续跟踪索引操作的内存使用 currentCombinedCoordinatingAndPrimaryBytes // 协调+主分片 currentReplicaBytes // 副本操作 ``` ## 反压机制 当内存使用超过限制时: 1. **正常请求**:拒绝并抛出 `EsRejectedExecutionException` 2. **强制请求**:允许执行(需要设置 `forceExecution=true`) 3. **统计跟踪**:记录拒绝次数以便监控 --- ## 查询索引压力统计 ## API 查询 ```bash # 查询所有节点的索引压力统计 GET _nodes/stats/indexing_pressure # 查询特定节点 GET _nodes/node-1/stats/indexing_pressure ``` ## 响应示例 ```json { "nodes": { "node-1": { "indexing_pressure": { "memory": { "current": { "combined_coordinating_and_primary_in_bytes": 8388608, "replica_in_bytes": 12582912 }, "total": { "combined_coordinating_and_primary_in_bytes": 104857600, "replica_in_bytes": 157286400 }, "limit_in_bytes": 107374182 }, "rejection": { "combined_coordinating_and_primary": 0, "replica": 0 } } } } } ``` --- ## 使用场景 ## 1. 高吞吐索引场景 ```yaml # 大量数据写入场景 indexing_pressure.memory.limit: 25% ``` **适用情况**: - 日志采集系统 - 指标数据写入 - 批量数据导入 ## 2. 混合工作负载 ```yaml # 节点同时处理索引和搜索 indexing_pressure.memory.limit: 10% ``` **适用情况**: - 搜索和写入并存的场景 - 需要为搜索操作预留内存 ## 3. 内存受限环境 ```yaml # 小堆内存配置 indexing_pressure.memory.limit: 5% ``` **适用情况**: - 堆内存小于 4GB 的节点 - 容器化部署环境 ## 4. 批量导入优化 ```yaml # 批量导入时临时增加限制 PUT _cluster/settings { "transient": { "indexing_pressure.memory.limit": "30%" } } ``` --- ## 错误处理 ## 内存超限错误 当索引操作被拒绝时,返回以下错误: ```json { "error": { "type": "es_rejected_execution_exception", "reason": "rejected execution of coordinating operation [ coordinating_and_primary_bytes=8589934592, limit=1073741824, replica_bytes=0, replica_limit=1610612736 ], user: false, caller: [indices:data/write/bulk]" } } ``` ## 强制执行 对于关键操作,可以使用强制执行: ```json POST /_bulk?forceExecution=true {"index": {"_index": "test", "_id": "1"}} {"field": "value"} ``` --- ## 推荐配置 ## 默认配置 ```yaml # 适用于大多数场景 indexing_pressure.memory.limit: 10% ``` ## 高吞吐配置 ```yaml # 日志和指标收集 indexing_pressure.memory.limit: 20% ``` ## 搜索优先配置 ```yaml # 搜索为主,写入为辅 indexing_pressure.memory.limit: 5% ``` ## 大堆内存配置 ```yaml # 堆内存 > 32GB indexing_pressure.memory.limit: 15% ``` --- ## 监控建议 ## 关键指标 1. **当前内存使用**:`current.combined_coordinating_and_primary_in_bytes` 2. **总内存使用**:`total.combined_coordinating_and_primary_in_bytes` 3. **拒绝次数**:`rejection.combined_coordinating_and_primary` ## 告警规则 ```yaml # 内存使用超过 80% 时告警 current_usage / limit > 0.8 # 出现拒绝时告警 rejection_count > 0 ``` --- ## 注意事项 1. **动态更新**:此配置可以动态更新,无需重启 2. **副本乘数**:副本操作的限制是主限制的 1.5 倍 3. **与断路器配合**:与 `indices.breaker.total` 等断路器配置配合使用 4. **监控重要**:持续监控内存使用和拒绝情况 5. **渐进调优**:根据实际负载逐步调整,避免一次性设置过大