| 題記 |html
網上當前(截止20170914)流傳的各類配置文件普通存在如下問題: java
1)版本低,不能和當前版本5.X匹配。 node
2)5.X的配置自己較1.X,2.X就有很大不一樣,原有配置已不適用。 git
3)ES英文、中文文檔也沒有及時更新。github
如今,確保ES5.X的高性能到底須要哪些配置愈加使人神往。bootstrap
如下清單內容參考了ES官網文檔,且都是在ES5.4.0的環境中驗證過的,請放心使用。vim
清單1:瞭解ES集羣拓撲結構服務器
您須要肯定您的部署拓撲,以便作出正確的Elasticsearch配置決策。併發
當咱們啓動Elasticsearch的實例,就會啓動至少一個節點。相同集羣名的多個節點的鏈接組成一個集羣,app
在默認狀況下,集羣中的每一個節點均可以處理Http請求和集羣節點的數據傳輸。
集羣中的全部的節點都知道集羣中其餘全部的節點,能夠將客戶端請求轉發到適當的節點。
瞭解節點的類別,以下
主節點(master):
node.master:true node.data:false
數據節點(data):
node.master:false node.data:true
客戶端/路由節點(client):
node.master:false node.data:false
默認狀況下,節點同時是主節點和數據節點,這適合小集羣(3個節點);大於3個節點後,分離主節點和數據節點變得很是重要。
清單2:配置線程池
儘可能不要動線程池這個配置,若是要動,建議改成:
int(( 核心數 3 )/ 2 )+ 1 。
同時知足:不容許bulk和’indexing’線程池的大小大於CPU內核數。
舉例:24核處理器,檢索服務器是24核,因此:線程池的大小
=(24*3)/2+1=37,
同時要知足cpu核數爲24。37和24取最小值,應該選擇24。
默認的隊列大小是1000,
如今的問題是:併發請求數據超過了隊列最大的大小,致使出錯。
可能的解決方案:
1)、增長隊列大小;(太大了,可能會致使內存溢出)
2)、增長節點數和副本數。
隊列大小:
在elasticsearch.yml中新增以下配置(5.X已經驗證):
thread_pool.search.size: 24
thread_pool.search.queue_size: 2000
#Bulk pool
thread_pool.bulk.size: 24
thread_pool.bulk.queue_size: 1000
thread_pool.index.size: 24
thread_pool.index.queue_size: 1000
若是你的批量請求數目高於隊列大小,將會出現RemoteTransportException異常。
清單3:配置堆內存
Elasticsearch 默認安裝後設置的堆內存是 1 GB。
修改方式一:
以下環境變量修改方式,指定堆內存大小爲4g。
export ES_HEAP_SIZE=4g
修改方式二:
命令行啓動設置方式。
./bin/elasticsearch -Xmx4g -Xms4g
修改方式三:(5.x版本建議)
修改 jvm.options配置文件。
-Xms4g
-Xmx4g
確保堆內存最小值( Xms )與最大值( Xmx )的大小是相同的,防止程序在運行時改變堆內存大小, 這是一個很耗系統資源的過程。
修改後查看:
[elasticsearch@4da2 bin]$ ps -ef | grep elasticsearch
root 17501 17474 0 Sep13 pts/2 00:00:00
su elasticsearch500 20389 1 17 04:31
pts/2 00:00:47 /usr/java/jdk1.8.0_91/bin/java
-Xms4g -Xmx4g -XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=75
-XX:+UseCMSInitiatingOccupancyOnly
-XX:+DisableExplicitGC -XX:+AlwaysPreTouch
-server -Xss1m -Djava.awt.headless=true
-Dfile.encoding=UTF-8 -Djna.nosys=true
-Djdk.io.permissionsUseCanonicalPath=true
-Dio.netty.noUnsafe=true
-Dio.netty.noKeySetOptimization=true
-Dio.netty.recycler.maxCapacityPerThread=0
-Dlog4j.shutdownHookEnabled=false
-Dlog4j2.disable.jmx=true
-Dlog4j.skipJansi=true
-XX:+HeapDumpOnOutOfMemoryError
-Des.path.home=/opt/elasticsearch
-cp /opt/elasticsearch/lib/* org.elasticsearch.bootstrap.Elasticsearch -d
注意:
最大可分配堆內存大小爲:
32GB與當前ES宿主機內存兩者的最小值。
舉例1):ES宿主機內存:128GB,可供分配的堆內存:32GB。(建議31GB)
舉例2):ES宿主機內存:32GB,可供分配的堆內存:16GB。
清單4:禁止swapping操做
在你的 elasticsearch.yml 文件中的Memory部分,修改設置以下:
bootstrap.memory_lock : true
核心緣由:內存交換 到磁盤對服務器性能來講是 致命 的。
早期的版本叫:bootstrap.mlockall,
5.X版本更名爲:bootstrap.memory_lock。
清單5:配置文件描述符數目
切換到ES的啓動帳戶,如Elasticsearch。
步驟1)設置環境變量。
vim /etc/profile
增長
ulimit -n 65535
用以設定同一時間打開的文件數的最大值爲65535。
source /etc/profile 使得命令生效。
步驟2)修改limits.conf配置文件。
/etc/security/limits.conf
增長
步驟3)切換到Elasticsearch用戶,使用ulimit -a 查看是否修改爲功。
[root@4da2 elasticsearch]# ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 516047
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65535
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 4096
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
核心緣由: Elasticsearch 在節點和 HTTP 客戶端之間進行通訊也使用了大量的套接字(注:sockets)。 全部這一切都須要足夠的文件描述符。
而: 許多現代的 Linux 發行版本,每一個進程默認容許一個微不足道的 1024 文件描述符。這對一個小的 Elasticsearch 節點來講實在是太 低 了,更不用說一個處理數以百計索引的節點。
清單6:修改最大映射數量MMP
Elasticsearch 對各類文件混合使用了 NioFs( 非阻塞文件系統)和 MMapFs ( 內存映射文件系統)。
請確保你配置的最大映射數量,以便有足夠的虛擬內存可用於 mmapped 文件。這能夠暫時設置:
sysctl -w vm.max_map_count=262144
或者你能夠在 /etc/sysctl.conf 經過修改 vm.max_map_count 永久設置它。
[root@4ad # tail -f /etc/sysctl.confvm.max_map_count=262144
實施生成環境或者部署ES環境供使用以前,請仔細覈對以上清單列表。
小結
確保ES的高性能是一個永恆的話題,還有很長的路要走。
讓咱們一塊兒精進,高效習得ES技能!
[1] 5.X版本的配置變化:
https://www.elastic.co/guide/en/elasticsearch/reference/current/breaking_50_settings_changes.html
[2] 線程池大小問題
https://github.com/elastic/elasticsearch/issues/15582
[3] swap配置
https://www.elastic.co/guide/en/elasticsearch/reference/master/setup-configuration-memory.html