Elasticsearch 優化實施方法

1.儘量運行在Sun/Oracle JDK1.7以上環境中,低版本的jdk容易出現莫名的bug,ES性能體現在在分佈式計算中,一個節點是不足以測試出其性能,一個生產系統至少在三個節點以上。

2.ES集羣節點規劃良好,master、node、client分離開來,data節點關閉http功能。

3.合理利用內存。JVM內存設置不要超過機器的一半內存,並且不超過32G(一般分配主機1/4-1/2的內存)。

if [ "x$ES_MIN_MEM" =
"x" ]; then   
ES_MIN_MEM=12g
fi
if [ "x$ES_MAX_MEM" =
"x" ]; then  
ES_MAX_MEM=12g
fi

JAVA_OPTS="$JAVA_OPTS
-Xms${ES_MIN_MEM}"

JAVA_OPTS="$JAVA_OPTS
-Xmx${ES_MAX_MEM}"

a)設置每個線程的堆棧大小, ES單線程承載的數據量比較大

JAVA_OPTS="$JAVA_OPTS -Xss128m"

b) 修改swapping參數,內存不夠用時才進行swapping(vm.swappiness= 1)
c) 暫時不要修改GC方法
d)鎖定內存,不讓JVM寫入swapping,避免降低ES的性能

bootstrap.mlockall: true

e)緩存類型設置爲Soft Reference,只有當內存不夠時纔會進行回收

index.cache.field.max_size: 50000
index.cache.field.expire: 10m
index.cache.field.type: soft

4.權衡建索引的性能和檢索的時效性,修改以下參數。

“index.translog.flush_threshold_ops”:”10000”
“index.refresh_interval”:1
“number_of_replicas”: 0

5.倒排詞典的索引需要常駐內存,無法GC,需要監控data node上segment memory增長趨勢。


定期對不再更新的索引做optimize (ES2.0以後更改爲force merge api)。這Optimze的實質是對segment file強制做合併,可以節省大量的segment memory


6.根據機器數,磁盤數,索引大小等硬件環境,根據測試結果,設置最優的分片數和備份數,單個分片最好不超過10GB,定期刪除不用的索引,做好冷數據的遷移。


7.保守配置內存限制參數,儘量使用doc value存儲以減少內存消耗,查詢時限制size、from參數。


8.如果不使用_all字段最好關閉這個屬性,否則在創建索引和增大索引大小的時候會使用額外更多的CPU,如果你不受限CPU計算能力可以選擇壓縮文檔的_source。這實際上就是整行日誌,所以開啓壓縮可以減小索引大小。


9.避免返回大量結果集的搜索與聚合。缺失需要大量拉取數據可以採用scan & scroll api來實現。


10.熟悉各類緩存作用,如field cache, filter cache, indexing cache, bulk queue等等,要設置合理的大小,並且要應該根據最壞的情況來看heap是否夠用。


11.必須結合實際應用場景,並對集羣使用情況做持續的監控。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章