背景
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.3 |