Elasticsearch 2.20 使用環境說明
來自: http://my.oschina.net/secisland/blog/614165
環境變量
Elasticsearch是Java開發的,所以JVM的環境變量JAVA_OPTS對Elasticsearch也是非常重要的。在JAVA_OPTS中對Elasticsearch最重要的參數是-Xmx最大可以使用內存的參數,一般情況下大內存更能發揮Elasticsearch作用,建議-Xmx設置為物理內存的一半,為了減少內存分配帶來的性能損耗,最好一開始就設置初始內存和最大內存都為物理內存的一半。及Xms和Xmx這兩個參數。
由于JAVA_OPTS大多數時候對整個機器環境起作用,所以最好是保留默認的JAVA_OPTS,最好用ES_JAVA_OPTS環境變量設置來作為JAVA_OPTS參數。
默認的配置文件在elasticsearch/bin/elasticsearch.in.sh中
if [ "x$ES_MIN_MEM" = "x" ]; then ES_MIN_MEM=256m fi if [ "x$ES_MAX_MEM" = "x" ]; then ES_MAX_MEM=1g fi if [ "x$ES_HEAP_SIZE" != "x" ]; then ES_MIN_MEM=$ES_HEAP_SIZE ES_MAX_MEM=$ES_HEAP_SIZE fi JAVA_OPTS="$JAVA_OPTS -Xms${ES_MIN_MEM}" JAVA_OPTS="$JAVA_OPTS -Xmx${ES_MAX_MEM}"
ES_HEAP_SIZE環境變量允許設置被分配到Elasticsearch java進程中堆內存大小。最小和最大值將分配相同的值到,可以通過設置 ES_MIN_MEM(默認為256M)和ES_MAX_MEM(默認為1G)對堆內存進行設置(不推薦)。
系統配置
文件描述符(File Descriptor)
文件描述符,是一個簡單的整數,用以標明每一個被進程所打開的文件和socket。第一個打開的文件是0,第二個是1,依此類推。要增加打開的文件描述符的數量,建議設置為32K或64K。
為了測試有多少個文件在進程中可以被打開,環境變量-Des.max-open-files設置為true。 Elasticsearch將在啟動時打印打開文件描述符的數量。或者,您可以通過查看每個節點信息的API進行查看。執行:
GET localhost:9200/_nodes/stats/process?pretty
文件存儲:
Elasticsearch采用混合mmap fs /nio fs為默認的方式存儲索引。默認的操作系統mmap設置可能是太低,這可能會導致內存溢出異常。在Linux系統中,您可以用root賬戶通過以下命令來增加限制:
sysctl -w vm.max_map_count=262144
如果要想使設置永久生效,可以設置/etc/sysctl.conf中的vm.max_map_count值。
注意:如果使用安裝包(.deb, .rpm)來進行安裝,此值會自動進行設置。
文件系統的存儲類型
有不同的文件系統的有不同存儲類型。這個參數一般會自動選擇:Windows 64bit操作系統一般是mmapfs,在Windows 32位操作系統一般是simplefs,Elasticsearch默認為(niofs/mmapfs混合方式)。這個參數可以配置使所有的索引生效,配置文件為config/elasticsearch.yml。
配置項:index.store.type: niofs
也可以在建索引的時候指定類型:
PUT localhost:9200/my_index{ "settings": { "index.store.type": "niofs" } }
注意:這個設置有可能在未來被刪除。
可選擇的參數
Simple FS(簡單文件系統)
Simplefs類型是一個簡單的實現隨機訪問文件的文件存儲系統(映射到Lucene SimpleFsDirectory的)。該實現的并發性能較差(多線程是個瓶頸)。當你需要將索引持久化時,最好使用niofs。
NIO FS(NIO文件系統)
niofs類型是通過NIO將分片索引文件寫到文件系統上(映射到Lucene NIOFSDirectory)。它允許多線程同時讀取文件。不建議在Windows系統上使用,由于JAVA在實現上有一個錯誤。
MMap FS(內存映射文件系統)
mmapfs類型通過映射文件到內存中(MMAP)存儲分片索引到文件系統上(映射到Lucene MMapDirectory)。內存映射的過程中將劃分出與被映射文件大小一樣的虛擬內存空間。使用這個類之前,請確保您有足夠的虛擬地址空間。
default_fs
默認類型是混合NiO FS和mmapfs,系統會自動選擇操作系統匹配最好的文件系統。目前只有Lucene的term dictionary和doc values采用內存映射的方式來減少對操作系統的影響。所有其他的方式都使用Lucene niofsdirectory打開。
本文由賽克藍德(secisland)原創,轉載請標明作者和出處。
內存設置
現代操作系統大多數使用盡可能多的內存來作為文件系統緩存,并通過交換分區(swap)來移走程序中暫時不用的內存。這可能會導致Elasticsearch進程內存被過多的切換。交換分區(swap)對性能和穩定性都有一定的影響,所以在Elasticsearch中應該盡量避免使用交換分區。
在Elasticsearch設置中有三種方式可以選擇:
1、禁用交換分區
這是一種最簡單的方式:
在linux系統中,可以通過命令:sudo swapoff -a暫時禁止.如果要永久禁用,需要編輯/etc/fstab文件,注釋掉包含swap的行。
在windows系統中可以通過控制面板->系統->高級系統設置->高級->性能設置->高級->虛擬內存中進行設置。
2、配置swappiness
要確保sysctl設置vm.swappiness參數為0,在通常情況下會降低交換的頻率,同時在緊急情況下會啟用交換。
注意:在內核3.5-rc1及以上版本中,如果設置vm.swappiness為零,OOM將會采用殺進程的方式來代替內存交換,需要設置vm.swappiness為1,會在緊急情況下會啟用交換。
3、使用mlockall
在Unix或Linux系統中或者設置了virtuallock 的Windows,可以試圖鎖定進程地址空間到RAM中,防止任何Elasticsearch內存被交換出去。 可以在config/elasticsearch.yml進行設置:
bootstrap.mlockall: true
啟動后Elasticsearch后,你可以通過api檢查mlockall是否成功應用:
如果返回值中的mlockall為false,這就意味著mlockall設置失敗。最有可能的原因是,在Linux/Unix系統中,運行Elasticsearch的用戶沒有權限設置。這可以通過root用戶運行ulimit -l unlimited進行設置。另一個可能的原因是,mlockall不能在臨時目錄中(通常是/tmp)生效。這可以通過指定一個新的臨時目錄解決,在啟動Elasticsearch時指定:
./bin/elasticsearch -Djna.tmpdir=/path/to/new/dir
注意:當系統沒有可用內存時,在Elasticsearch嘗試分配更多的內存時,mlockall可能導致JVM或shell會話的退出。
賽克藍德(secisland)后續會逐步對Elasticsearch的最新版本的各項功能進行分析,近請期待。