1. 程式人生 > 實用技巧 >ES記憶體使用分析及熔斷器設定

ES記憶體使用分析及熔斷器設定

記憶體佔用

ES的JVM heap按使用場景分為可GC部分和常駐部分。 可GC部分記憶體會隨著GC操作而被回收; 常駐部分不會被GC,通常使用LRU策略來進行淘汰; 記憶體佔用情況如下圖:

common space包括了indexing buffer和其他ES執行需要的class。indexing buffer由indices.memory.index_buffer_size引數控制, 預設最大佔用10%,當full up後,該部分資料被刷入磁碟對應的Segments中。這部分空間是可以被回收反覆利用的。

queryCache 是node級別的filter過濾器結果快取,大小由indices.queries.cache.size 引數控制,預設10%。使用LRU淘汰策略。

requestCache是shard級別的query result快取,通常only requests of size 0 such as aggregations, counts and suggestions will be cached。使用LRU淘汰策略。通過indices.requests.cache.size引數控制,預設1%。設定後整個NODE都生效。

fieldDataCache,針對text欄位,沒有docValues屬性(相當於列儲存),當對text型別欄位進行sort,agg時,需要將對應的欄位內容全部載入到記憶體,這部分資料就放在fieldDataCache。通過indices.fielddata.cache.size 引數限制大小,預設不限制。這種情況下,佔用記憶體會逐漸增多,直到觸發熔斷;新資料無法載入。

segmentsMemory ,快取段資訊,包括FST,Dimensional points for numeric range filters,Deleted documents bitset ,Doc values and stored fields codec formats等資料。這部分快取是必須的,不能進行大小設定,通常跟index息息相關,close index、force merge均會釋放部分空間。 可以通過命令

GET _cat/nodes?v&h=id,ip,port,r,ramPercent,ramCurrent,heapMax,heapCurrent,fielddataMemory,queryCacheMemory,requestCacheMemory,segmentsMemory

檢視當前各塊的使用情況。

熔斷器

Elasticsearch 有一系列的斷路器,它們都能保證記憶體不會超出限制:

  • indices.breaker.fielddata.limit fielddata斷路器預設設定堆的 60% 作為 fielddata 大小的上限。
  • indices.breaker.request.limit request斷路器估算需要完成其他請求部分的結構大小,例如建立一個聚合桶,預設限制是堆記憶體的 60%。它實際上是node level的一個統計值,統計的是這個結點上,各類查詢聚合操作,需要申請的Bigarray的空間大小總和。 所以如果有一個聚合需要很大的空間,同時在執行的聚合可能也會被break掉。
  • indices.breaker.total.limit 父熔斷,inflight、request(agg)和fielddata不會使用超過堆記憶體的 70%。
  • network.breaker.inflight requests.limit 限制當前通過HTTP等進來的請求使用記憶體不能超過Node記憶體的指定值。這個記憶體主要是限制請求內容的長度。預設100%。
  • script.max_compilations_per_minute
  • 限制script併發執行數,預設值為15。

參考文件 https://www.elastic.co/guide/en/elasticsearch/reference/5.3/circuit-breaker.html#fielddata-circuit-breaker https://www.elastic.co/guide/cn/elasticsearch/guide/cn/_limiting_memory_usage.html http://zhengjianglong.leanote.com/post/ES%E8%AE%BE%E7%BD%AE