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

配置项概述 #

indexing_pressure.memory.limit 配置控制索引操作可以使用的最大内存量。当内存使用超过限制时,系统会拒绝新的索引请求以防止节点因内存不足而变得不稳定。

配置项默认值说明
indexing_pressure.memory.limit10%索引操作内存限制

配置说明 #

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.memory.limit
  • 跟踪内容:协调节点和主分片写入的内存使用
  • 内存类型:合并跟踪协调和主分片操作的内存

2. 副本操作 #

  • 限制indexing_pressure.memory.limit × 1.5
  • 跟踪内容:副本写入的内存使用
  • 原因:副本写入与主分片写入同时进行,需要更高的限制

3. 组合限制 #

┌──────────────────────────────────────────────┐
│           索引压力内存限制                     │
├──────────────────┬───────────────────────────┤
│  协调+主分片      │        副本操作            │
│  limit: 10%      │    limit: 10% × 1.5 = 15%  │
│                  │                           │
│  当前使用: 8%     │    当前使用: 12%           │
└──────────────────┴───────────────────────────┘

工作原理 #

内存跟踪 #

// 系统持续跟踪索引操作的内存使用
currentCombinedCoordinatingAndPrimaryBytes  // 协调+主分片
currentReplicaBytes                          // 副本操作

反压机制 #

当内存使用超过限制时:

  1. 正常请求:拒绝并抛出 EsRejectedExecutionException
  2. 强制请求:允许执行(需要设置 forceExecution=true
  3. 统计跟踪:记录拒绝次数以便监控

查询索引压力统计 #

API 查询 #

# 查询所有节点的索引压力统计
GET _nodes/stats/indexing_pressure

# 查询特定节点
GET _nodes/node-1/stats/indexing_pressure

响应示例 #

{
  "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. 高吞吐索引场景 #

# 大量数据写入场景
indexing_pressure.memory.limit: 25%

适用情况

  • 日志采集系统
  • 指标数据写入
  • 批量数据导入

2. 混合工作负载 #

# 节点同时处理索引和搜索
indexing_pressure.memory.limit: 10%

适用情况

  • 搜索和写入并存的场景
  • 需要为搜索操作预留内存

3. 内存受限环境 #

# 小堆内存配置
indexing_pressure.memory.limit: 5%

适用情况

  • 堆内存小于 4GB 的节点
  • 容器化部署环境

4. 批量导入优化 #

# 批量导入时临时增加限制
PUT _cluster/settings
{
  "transient": {
    "indexing_pressure.memory.limit": "30%"
  }
}

错误处理 #

内存超限错误 #

当索引操作被拒绝时,返回以下错误:

{
  "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]"
  }
}

强制执行 #

对于关键操作,可以使用强制执行:

POST /_bulk?forceExecution=true
{"index": {"_index": "test", "_id": "1"}}
{"field": "value"}

推荐配置 #

默认配置 #

# 适用于大多数场景
indexing_pressure.memory.limit: 10%

高吞吐配置 #

# 日志和指标收集
indexing_pressure.memory.limit: 20%

搜索优先配置 #

# 搜索为主,写入为辅
indexing_pressure.memory.limit: 5%

大堆内存配置 #

# 堆内存 > 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

告警规则 #

# 内存使用超过 80% 时告警
current_usage / limit > 0.8

# 出现拒绝时告警
rejection_count > 0

注意事项 #

  1. 动态更新:此配置可以动态更新,无需重启
  2. 副本乘数:副本操作的限制是主限制的 1.5 倍
  3. 与断路器配合:与 indices.breaker.total 等断路器配置配合使用
  4. 监控重要:持续监控内存使用和拒绝情况
  5. 渐进调优:根据实际负载逐步调整,避免一次性设置过大