天天看點

FST Off Heap 記憶體優化

背景

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

繼續閱讀