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

配置项作用 #

cache.recycler.page.limit.heap 配置项用于控制页面缓存回收器(Page Cache Recycler)可以使用的最大堆内存量。该回收器负责缓存和重用固定大小的内存页(16KB),包括 byte[]int[]long[]Object[] 四种类型,以减少频繁的内存分配和垃圾回收开销。

通过合理设置此配置,可以在内存使用效率和性能之间取得平衡。

配置项类型 #

该配置项为静态配置,需要在 easysearch.yml 配置文件中设置,修改后需要重启节点才能生效。

默认值 #

10% (JVM 堆内存的 10%)

是否必需 #

可选配置项(有默认值)

取值格式 #

<百分比>% 或 <字节值>
  • 百分比:基于 JVM 堆内存大小计算,如 5%10%
  • 字节值:指定具体的字节数,如 100mb1gb

配置格式 #

# easysearch.yml

# 默认配置
cache.recycler.page.limit.heap: 10%

# 增加缓存大小
cache.recycler.page.limit.heap: 20%

# 禁用页面缓存
cache.recycler.page.limit.heap: 0%

# 指定具体大小
cache.recycler.page.limit.heap: 200mb

工作原理 #

┌─────────────────────────────────────────────────────────────────┐
│                   页面缓存内存分配机制                           │
└─────────────────────────────────────────────────────────────────┘

JVM 堆内存
    │
    ├── cache.recycler.page.limit.heap (如 10%)
    │   │
    │   ├── 根据 weight 分配给不同类型
    │   │   │
    │   │   ├── byte[] pages (weight: 1.0)
    │   │   ├── int[] pages (weight: 1.0)
    │   │   ├── long[] pages (weight: 1.0)
    │   │   └── Object[] pages (weight: 0.1)
    │
    └── 其他用途(索引、查询缓存等)

页面规格:

  • 页面大小固定:16KB (16384 字节)
  • byte[] 页面:16KB / 1 = 16,384 字节
  • int[] 页面:16KB / 4 = 4,096 个 int
  • long[] 页面:16KB / 8 = 2,048 个 long
  • Object[] 页面:16KB / 8(引用大小)= 2,048 个引用

内存分配计算 #

假设堆内存为 4GB,cache.recycler.page.limit.heap: 10%

总缓存大小 = 4GB × 10% = 400MB
最大页面数 = 400MB / 16KB ≈ 25,600 页

各类型分配(默认权重):
- byte[]:  1.0 / 3.1 × 25,600 ≈ 8,258 页
- int[]:   1.0 / 3.1 × 25,600 ≈ 8,258 页
- long[]:  1.0 / 3.1 × 25,600 ≈ 8,258 页
- Object[]: 0.1 / 3.1 × 25,600 ≈ 826 页

使用场景 #

1. 默认配置(推荐) #

cache.recycler.page.limit.heap: 10%

适用于大多数场景,平衡了内存使用和性能。

2. 大内存节点 #

cache.recycler.page.limit.heap: 20%

对于堆内存较大(如 32GB+)的节点,可适当增加缓存大小。

3. 内存受限环境 #

cache.recycler.page.limit.heap: 5%

对于内存紧张的环境,减少缓存以节省内存。

4. 禁用缓存 #

cache.recycler.page.limit.heap: 0%

完全禁用页面缓存,每次都新建对象。仅用于特殊调试场景。

相关配置 #

页面缓存的内存分配还受以下权重配置影响:

# 各类型页面的权重(相对重要性)
cache.recycler.page.weight.bytes: 1.0   # byte[] 页面权重
cache.recycler.page.weight.ints: 1.0    # int[] 页面权重
cache.recycler.page.weight.longs: 1.0   # long[] 页面权重
cache.recycler.page.weight.objects: 0.1 # Object[] 页面权重(默认较低)

# 回收器类型
cache.recycler.page.type: CONCURRENT    # 可选: QUEUE, CONCURRENT, NONE

推荐设置建议 #

堆内存大小推荐值缓存大小说明
≤ 4GB10%≤ 400MB默认配置即可
4-16GB10-15%400MB-2.4GB可适当增加
16-32GB15-20%2.4GB-6.4GB内存充足时可增加
≥ 32GB20%≥ 6.4GB大内存节点可提高
SSD 存储可提高-SSD 支持更激进的缓存
内存受限5-10%-优先保证索引和查询内存

监控与调优 #

# 查看当前配置
GET /_nodes/settings?filter_path=nodes.*.cache.recycler

# 监控内存使用
GET /_nodes/stats/jvm?filter_path=nodes.*.jvm.mem

# 查看节点信息
GET /_nodes/stats

调优指南 #

  1. 监控 GC 行为:如果 GC 频率过高,可尝试增加缓存
  2. 监控内存使用:确保缓存不会挤占索引和查询内存
  3. 按需调整:根据实际工作负载特点调整各类型权重
  4. 分阶段调优:先调整整体限制,再调整各类型权重

注意事项 #

  1. 静态配置:修改此配置需要重启节点
  2. 内存总量:缓存来自堆内存,需与索引缓冲区、查询缓存等协调
  3. 权重平衡:调整某类型权重会影响其他类型的分配
  4. 页面粒度:内存按 16KB 页面分配,实际使用可能有少量偏差
  5. GC 影响:合理的缓存可减少 GC,但过大可能增加 GC 压力
  6. 所有节点一致:集群中各节点配置应保持一致