有奖捉虫:行业应用 & 管理与支持文档专题 HOT

背景

在 ES 单节点上,倒排索引中的 FST 结构默认常驻堆内内存,占比较高,尤其是在大磁盘的冷节点上,占比可达50%+,制约了单节点管理磁盘的能力,堆内内存受限,影响节点可用性。而在冷节点上,查询请求非常少,FST 常驻内存意义不大,因此我们需要将该部分数据结构移动到堆外管理,默认不加载,需要时从磁盘加载到堆外直接使用,以降低堆内内存使用量,提升单节点磁盘管理能力。

优化方案

基于 WLFU 淘汰策略,实现精准控制的堆外 cache,堆内基于零拷贝、弱引用实现第二级 cache,性能和堆内访问基本持平。

使用方式

开启、关闭 Off Heap 功能(默认关闭)

curl -H "Content-Type:application/json" -XPUT http://localhost:9200/_cluster/settings -d '{
"persistent" : {
"indices.segment_memory.off_heap.enable" : true
}
}'

调整 Off Heap Cache 大小(默认500MB)

curl -H "Content-Type:application/json" -XPUT http://localhost:9210/_cluster/settings -d '{
"persistent" : {
"indices.segment_memory.off_heap.size" : "5gb"
}
}'
可以设置为单节点堆外内存的1/3,最大不要超过32GB。具体示例如下:
单节点总内存(包括 jvm 和堆外内存)共64GB,可以设置为(64-32)/3 = 10GB。
单节点总内存(包括 jvm 和堆外内存)共96GB,可以设置为(96-32)/3 = 20GB。

优化效果

内存开销、数据管理能力、GC 优势明显,性能持平略有优势。
方案对比
FST 存放位置
FST 内存占用量
单个 FST 堆内存占用量
单节点最大磁盘数据量
原生方案
堆内内存
全量存储在内存中,内存占用量大
MB 级别(源生 FST 数据结构)
10TB(需调优)
优化方案
堆外内存
Cache LRU 淘汰冷数据 内存占用量小
100Byte左右(Cache Key 大小)
50TB
写入性能对比
内存使用量(MB)
GC 时长(s)
TPS
90%时延(ms)
99%时延(ms)
原生方案
402.59
20.453
198051
463.201
617.701
优化方案
102.217
18.969
201188
455.124
618.379
Diff
优74.6%
优7.26%
优1.58%
优1.74%
劣0.11%
查询性能对比
内存使用量(MB)
GC 时长(s)
QPS
90%时延(ms)
99%时延(ms)
原生方案
401.806
20.107
200.057
3.96062
11.1894
优化方案
101.004
19.228
200.087
3.87805
11.2316
Diff
优74.9%
优4.37%
-
优2.00%
劣0.38%

支持版本

6.8.2、7.5.1、7.10.1、7.14.2