加配置項index.merge.policy.floor_segment=設置每個segment最小值,index.merge.scheduler.max_thread_count=ES集群負載較低時,后台合並segment線程數,一般=核數/2;
curl -XPUT http://xxxx:9200/m_pd_cu_id_ip_2es_inc_hi_out/_settings -d '{"index.merge.policy.floor_segment":"100mb"}'
curl -XPUT http://xx:9200/m_pd_cu_id_rela_address_2es_dt_out/_settings -d '{"index.merge.scheduler.max_thread_count":"2"}'
原因分析:數據同步服務不斷的在提交索引構建,ES集群接收到構建請求數據后會緩沖到內存,達到一定量后生成segment,每個segment是一個包含正排(空間占比90~95%)+倒排(空間占比5~10%)的完整索引文件,每次搜索請求會將所有segment中的倒排索引部分加載到內存,進行查詢和打分,然后將命中的文檔號拿到正排中召回完整數據記錄;如果不對segment做配置,提交又特別頻繁的話,就會導致查詢性能下降,另外將這里的普通硬盤換成SSD,預計搜索性能還會提升3~5倍;
【總結】
搜索性能優化建議:
1.segment合並;索引節點粒度配置index.merge.policy.floor_segment=xx mb;segment默認最小值2M
2.索引時不需要做打分的字段,關閉norms選項,減少倒排索引內存占用量;字段粒度配置omit_norms=true;
3.BoolQuery 優於 TermQuery;目前需求場景全部不需要用到分詞,所以盡可能用BoolQuery;
4.避免使用對象嵌套結構組建document,建議優化為一個扁平化結構,查詢多個扁平化結構在內存做聚合關聯;
5.設定字符串類型為不分詞,可以用於字符串排序,但是比起數字排序會消耗cpu,搜索效率更低,慎用;
6.cache設置,就目前數據業務類型,保持默認配置即可,設值fielddata.cache之類的緩存命中率低,反而吃掉了ES集群的一部分內存;
索引性能優化建議:
1.調小索引副本數;針對索引節點粒度:curl -XPUT http://xxxx:9200/m_pd_cu_id_gps_2es_inc_hi_out/_settings -d '{"number_of_replicas":1}'
2.設置延遲提交,延遲提交意味着數據提交到搜索可見,有延遲,需要結合業務配置;針對索引節點粒度:curl -XPUT http://xxxx:9200/m_pd_cu_id_gps_2es_inc_hi_out/_settings -d '{"index.refresh_interval":"10s"}';默認值1s;
3.設置索引緩沖buffer,最大512m,默認值是jvm的10%;ES集群粒度config/elasticsearch.yml :indices.memory.index_buffer_size = 10%
4.適當減少備份數,必要字段只需要提供搜索,不需要返回則將stored設為false;
如果ES提交索引請求達到瓶頸,一般任務隊列task-queue為50,可以設置task-queue隊列,提升搜索集群索引能力;
以上涉及到索引節點/字段 粒度的配置,均可在創建時代碼指定;
————————————————
原文鏈接:https://blog.csdn.net/my201110lc/article/details/81712183
備注: segment合並的影響可能只有5%;現象:”發現每次搜索請求時,磁盤需要讀40M+的數據,然而一次請求的數據不過10+k“,這個是由於,es底層的lucene對文件的讀取采用了mmap方式,而你的機器內存不足以映射所有的文件,所以前幾次查詢時,會讀磁盤,而mmap讀取磁盤會默認預讀2M的數據量,這才是你請求10K的數據,卻有40M的io的真正原因,預讀的2M數據,假設有20條同步不在一個段上,那么就會產生40M的磁盤io。
解決這個問題的方法是設置這個參數:index.store.type為niofs,兩種方式,啟動時設置yml,對所有索引生效;或者在新建索引時指定settings中,對於已經建好的索引,必須先close,然后修改調用接口修改settings。再提一點,es默認的mmapfs其實是針對內存足夠的情況下使用的,也就是堆外內存能把所有的segment數據都加載進來。對於內存不足的情況,用niofs比較合適,因為它不會預讀,每次都走磁盤。
index.store.type 為 niofs
curl -XPUT 'http://localhost:9200/twitter/' -d '{
"settings" : {
"index" : {
"store":{
"type":"niofs"
},
"refresh_interval":"60s"
}
}
}'
Mmap fs可能讓大索引訪問變得緩慢: https://elasticsearch.cn/article/754
總結:
結論: 如果ES結點上會存放海量的索引數據,經常會有大索引(如1TB+)的搜索聚合操作,使用NIOFS會更安全,可以避免很多怪異的性能問題。 |