2015年10月28日 星期三

[elasticsearch] Elasticsearch heap 最佳配置 best practice



Elasticsearch  預設使用的 heap 大小設定是 1GB 。
對於實際的佈署與使用,1GB的設定是太小了。

這是非常不正確的設定,如果你使用預設的設定值來佈署你的cluster。

在Elasticsearch 中,有兩個方式可以改變 heap size 的大小。最簡單的方式就是使用設定 ES_HEAP_SIZE 的環境變數。當server process 啟動的時候,將會讀取設定的heap參數。

export ES_HEAP_SIZE=30.5g

另一方面,你也可以在啟動程序時,透過command-line 來設定 heap size。

./bin/elasticsearch -Xmx30.5g  -Xms30.5g


這裡有一點值得注意的是,把 heap 的最大(mx)最小(ms) 都設成相同的數字,避免成本很高的heap resizing 。

把一半的memory 留給 Lucene

heap size配置太大是一般常見的問題。如果你有一台64G的機器,你可能想的是把64G的記憶體都配置給 Elasticsearch 使用,希望配置的越多越好。

Heap 的配置在 Elasticsearch中相當的重要。因為眾多的資料結構存放在 momory裡,以提供快速的操作。還有另外一個memory 主要用戶就是Lucene ,使用 off heap 方式。(另外探討使用java 攥寫的大資料軟體們常用的技術 off heap )

Lucene 設計使用底層OS提供的caching 機制,來存放一些 in momory 的資料結構。 Lucene 的 segments file則是存成會被修改的個別檔案。這個設計使得 cache 緩存可以很好的得到應用。 底層OS很擅長的去把熱門的segments 在memory 內,使得這些 segments 可以快速的被讀取。

Lucene 的效能主要是在於與OS層的互動操作。所以,如果把所有可用的momory都配置給elasticsearch ,那們將沒有留下足夠的 momory 給 Lucene 。這將會對嚴重影響全文搜索的性能。

所以,邊準的建議是,配置可用記憶體的一半給 Elasticsearch 的 Heap ,
同時保留系統的一半記憶體。放心,這些記憶體不會被閒置,他們會大量的被Lucene所使用。

勿超過30.5G

還有一個不配置大heap給Elasticsearch的原因。就是,JVM 在30.5G下使用一個compress object pointers 的技巧。

在Java中,所有的object被配置在heap上,透過pointer 來引用。

沒有留言:

張貼留言