Elasticsearch 是如何使用堆記憶體的

2021-10-10 13:34:40 字數 2435 閱讀 9307

es的heap記憶體基本上被segment memory、filter cache、field data cache、bulk queue、indexing buffer、cluster state buffer、各類聚合查詢的結果集fetch所消耗掉,具體情況如下:

一、segment memory

1、segment不是file嗎?segment memory又是什麼?

前面提到過,乙個segment是乙個完備的lucene倒排索引,而倒排索引是通過詞典 (term dictionary)到文件列表(postings list)的對映關係,快速做查詢的。 由於詞典的size會很大,全部裝載到heap裡不現實,因此lucene為詞典做了一層字首索引(term index),這個索引在lucene4.0以後採用的資料結構是fst (finite state transducer)。 這種資料結構占用空間很小,lucene開啟索引的時候將其全量裝載到記憶體中,加快磁碟上詞典查詢速度的同時減少隨機磁碟訪問次數。

總之,要傳達的乙個意思就是,es的data node儲存資料並非只是耗費磁碟空間的,為了加速資料的訪問,每個segment都有會一些索引資料駐留在heap裡。因此segment越多,瓜分掉的heap也越多,並且這部分heap是無法被gc掉的! 理解這點對於監控和管理集群容量很重要,當乙個node的segment memory占用過多的時候,就需要考慮刪除、歸檔資料,或者擴容了。

怎麼知道segment memory占用情況呢?可通過cat api可以給出答案

1、檢視乙個索引所有segment的memroy占用情況:

2、檢視乙個node上所有segment占用的memory總和

2、怎樣減少data node上segment memory占用。

2.1、刪除不用的索引

2.2、關閉索引(檔案仍存在與磁碟,只是釋放掉記憶體),需要的時候可以重新開啟

2.3、定期對不再更新的索引做optimize()定期對不再更新的索引做optimize 。optimze的實質是對segment file強制做合併,可以節省大量的segment memory。

二、filter cache

filter cache是用來快取使用過的filter的結果集的,需要注意的是這個快取也是常駐heap,無法gc的。預設的10% heap size設定工作得夠好了,如果實際使用中heap沒什麼壓力的情況下,才考慮加大這個設定。

三、field data cache

四、bulk queue

bulk queue是做什麼用的?當所有的bulk thread都在忙,無法響應新的bulk request的時候,將request在記憶體裡排列起來,然後慢慢清掉。一般來說,bulk queue不會消耗很多的heap,但是見過一些使用者為了提高bulk的速度,客戶端設定了很大的併發量,並且將bulk queue設定到不可思議的大,比如好幾千。這在應對短暫的請求爆發的時候有用,但是如果集群本身索引速度一直跟不上,設定的好幾千的queue都滿了會是什麼狀況呢? 取決於乙個bulk的資料量大小,乘上queue的大小,heap很有可能就不夠用,記憶體溢位了。一般來說官方預設的thread

pool設定已經能很好的工作了,建議不要隨意去「調優」相關的設定,很多時候都是適得其反的效果。

五、indexing buffer

indexing buffer是用來快取新資料,當其滿了或者refresh/flush interval到了,就會以segment file的形式寫入到磁碟。這個引數的預設值是10% heap size。根據經驗,這個預設值也能夠很好的工作,應對很大的索引吞吐量。但有些使用者認為這個buffer越大吞吐量越高,因此見過有使用者將其設定為40%的。到了極端的情況,寫入速度很高的時候,40%都被占用,導致oom。

六、cluster state buffer七、超大搜尋聚合結果集的fetch

es是分布式搜尋引擎,搜尋和聚合計算除了在各個data node平行計算以外,還需要將結果返回給彙總節點進行彙總和排序後再返回。無論是搜尋,還是聚合,如果返回結果的size設定過大,都會給heap造成很大的壓力,特別是資料匯聚節點。

如切如磋,如琢如磨

有點難受的一天,以為幹了好多事情,晚上來機房補題,機房4個人,三個大佬乙個我。大佬們說的題和演算法我根本聽不懂,很挫敗。bgm my songs know what you did in the dark light em up string 我也不知道這首歌歌名為什麼沒有右括號 兩年了,我還是什麼...

RPM索引在Artifactory中是如何工作

rpm是用於儲存和管理rpm軟體包的倉庫。我們在rhel和centos系統上常用的yum安裝就是安裝的rpm軟體包,而yum的源就是乙個rpm軟體包的倉庫。jfrog artifactory是成熟的rpm和yum儲存庫管理器。jfrog的官方wiki頁面提供有關artifactory rpm儲存庫的...

MyBatis原始碼解析 Mapper是如何獲得?

希望讀者們能將這個基礎的流程熟讀於心 此處的configuration在構造defaultsqlsession的時候會載入進來 public class defaultsqlsession implements sqlsession try catch exception e 這個問題我們後續再進行...