理想狀況下,Elasticsearch應該在服務器上單獨運行,並使用全部可用的資源,爲了作到這一點,你須要配置你的操做系統,以容許運行Elasticsearch的用戶訪問默認容許的更多資源。html
在進行生產以前,必須考慮如下設置。java
在默認狀況下,Elasticsearch假定你在開發模式下工做,若是上面的任何設置沒有正確配置,警告將會寫入到日誌文件,可是你能夠啓動和運行你的Elasticsearch節點。node
只要你配置一個網絡設置,好比network.host
,Elasticsearch假定你正在轉向生產,並將上述警告升級爲異常,這些異常將阻止你的Elasticsearch節點啓動,這是一個重要的安全措施,以確保你不會由於配置錯誤的服務器而丟失數據。shell
在哪裏配置系統設置取決於你使用哪個包來安裝Elasticsearch,以及你正在使用的操做系統。bootstrap
當使用.zip
或.tar.gz
包時,系統設置可配置爲:segmentfault
ulimit
臨時更改配置/etc/security/limits.conf
中持久性更改配置當使用RPM或Debian包時,大多數系統設置都是在系統配置文件中設置的,可是,使用systemd
的系統須要在systemd
配置文件中指定系統限制。windows
在Linux系統上,ulimit
能夠用於臨時更改資源限制,在切換到要運行Elasticsearch的用戶以前,限制一般須要root身份設置。例如,要將打開文件句柄的數量(
ulimit -n`)設置爲65,536,你能夠執行如下操做:緩存
sudo su ulimit -n 65536 su elasticsearch
root
身份elasticsearch
用戶啓動Elasticsearch新限制僅在當前會話期間適用,你能夠用ulimit -a
查詢全部當前應用的限制。安全
在Linux系統上,能夠經過編輯/etc/security/limits.conf
文件來爲特定用戶設置持久性限制配置,要將用戶打開的文件的最大數量設置爲65,536,請在limits.conf
文件中添加如下一行:服務器
elasticsearch - nofile 65536
這個更改只會在下次elasticsearch
用戶打開一個新會話時生效。
Ubuntu 和 limits.conf
Ubuntu忽略了使用init.d
啓動的進程的limits.conf
文件,爲了啓用limits.conf
文件,編輯/etc/pam.d/su
而且取消下面行的註釋:
# session required pam_limits.so
當使用RPM或Debian包時,系統設置和環境變量能夠在系統配置文件中指定,它們位於:
/etc/sysconfig/elasticsearch
/etc/default/elasticsearch
然而,對於使用systemd
的系統,系統限制須要經過systemd
來指定。
當在使用systemd
的系統上使用RPM或Debian包時,必須經過systemd
指定系統限制。
systemd服務文件(/usr/lib/systemd/system/elasticsearch.service
)包含默認的應用限制。
要覆蓋它們,添加一個名爲etc/systemd/system/elasticsearch.service.d/override.conf
的文件(或者,你能夠運行sudo systemctl edit elasticsearch
,它在默認編輯器中自動打開文件),在此文件中設置任何更改,例如:
[Service] LimitMEMLOCK=infinity
完成後,運行如下命令從新加載單元:
sudo systemctl daemon-reload
大多數操做系統嘗試使用盡量多的內存用於文件系統緩存,並急切地交換未使用的應用程序內存,這可能致使JVM堆的某些部分甚至可執行頁面被交換到磁盤。
交換對性能、節點穩定性都很是不利,應該不惜一切代價避免交換,它能夠致使垃圾收集持續幾分鐘而不是幾毫秒,還能夠致使節點響應緩慢,甚至斷開與集羣的鏈接,在彈性分佈式系統中,它更有效的讓操做系統殺死節點。
禁用交換有三種方法,首選的選項是徹底禁用交換,若是這不是一個選項,是否選擇最小化的swappiness仍是內存鎖定取決於你的環境。
一般,Elasticsearch是一個容器上的惟一服務,而且它的內存使用由JVM選項控制,應該不須要啓用交換。
在Linux系統上,能夠運行如下命令暫時禁用交換:
sudo swapoff -a
要永久禁用它,你須要編輯/etc/fstab
文件,並註釋掉任何包含單詞swap
的行。
在Windows上,能夠經過徹底禁用分頁文件來實現等效功能,經過System Properties → Advanced → Performance → Advanced → Virtual memory
。
Linux系統上的另外一個可用選項是確保sysctl值vm.swappiness
設置爲1
,這減小了內核交換的趨勢,在正常狀況下不該該引發交換,同時仍然容許整個系統在緊急狀況下交換。
另外一種選擇是在Linux/Unix系統上使用mlockall,或者在Windows上使用VirtualLock,嘗試將進程地址空間鎖定到RAM中,以防止任何Elasticsearch內存被交換出去,這能夠經過向config/elasticsearch.yml
文件中添加這一行來實現:
bootstrap.memory_lock: true
mlockall
可能會致使JVM或shell會話退出,若是它試圖分配超過可用內存的內存!
在啓動Elasticsearch以後,經過檢查該請求的輸出中的mlockall
的值,你能夠看到是否成功應用了此設置:
GET _nodes?filter_path=**.mlockall
若是你看到mlockall
爲false
,那麼這意味着mlockall
請求失敗了,你還將看到日誌中包含更多信息Unable to lock JVM Memory
詞語的行。
在Linux/Unix系統上,最可能的緣由是運行Elasticsearch的用戶沒有鎖內存的權限,這能夠被授予以下:
.zip
和.tar.gz
root
身份設置ulimit -l unlimited
,或在/etc/security/limit.conf
中將memlock
設置爲unlimited
。MAX_LOCKED_MEMORY
設置爲unlimited
(或參閱下面使用systemd
的系統)。systemd
的系統systemd
配置中將LimitMEMLOCK
設置爲infinity
。mlockall
失敗的另外一個可能緣由是臨時目錄(一般是/tmp
)與noexec
選項一塊兒掛載,這能夠經過使用ES_JAVA_OPTS
環境變量指定一個新的臨時目錄來解決:
export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir" ./bin/elasticsearch
或者在jvm.options
配置文件中設置這個JVM標誌。
這隻適用於Linux和macOS,若是在Windows上運行Elasticsearch,則能夠被安全地忽略,在Windows上,JVM使用的 API僅限於可用資源。
Elasticsearch使用大量的文件描述符或文件句柄,耗盡文件描述符多是災難性的,而且極可能致使數據丟失,確保將運行Elasticsearch的用戶打開的文件描述符的數量限制增長到65,536或更高。
對於.zip
和.tar.gz
包,在啓動Elasticsearch以前做爲root
身份設置ulimit -n 65536
,或在/etc/security/limits.conf中設置nofile
爲65536
。
在macOS上,你還必須將JVM選項-XX:-MaxFDLimit
傳遞給Elasticsearch,以便使用更高的文件描述符限制。
RPM和Debian軟件包默認文件描述符的最大數量爲65536,不須要進一步配置。
你可使用節點Stats API檢查爲每一個節點配置的max_file_descriptors
,使用:
GET _nodes/stats/process?filter_path=**.max_file_descriptors
Elasticsearch默認使用mmapfs
目錄存儲索引,mmap計數的默認操做系統限制可能過低,這可能致使內存不足異常。
在Linux上,能夠經過以root
身份運行如下命令來增長限制:
sysctl -w vm.max_map_count=262144
要永久設置此值,請更新在/etc/sysctl.conf
中的vm.max_map_count
設置,要驗證從新引導後的效果,請運行sysctl vm.max_map_count
。
RPM和Debian包將自動配置此設置,不須要進一步的配置。
Elasticsearch爲不一樣類型的操做使用許多線程池,重要的是,它可以在須要時建立新的線程,確保Elasticsearch用戶可以建立的線程數至少是4096
個。
這能夠經過在啓動Elasticsearch以前做爲root身份設置ulimit -u 4096
,或者在/etc/security/limit.conf
中將nproc
設置爲4096
來實現。
看成爲服務在systemd
下運行時,包發行版將爲Elasticsearch進程自動配置線程數,不須要額外的配置。
Elasticsearch運行時有一個安全管理器,有了安全管理器,JVM默認無限期地緩存積極的主機名解析。若是你的Elasticsearch節點在DNS解析隨時間變化的環境中依賴於DNS(例如,節點到節點的發現),那麼你可能須要修改默認的JVM行爲,這能夠經過添加networkaddress.cache.ttl=<timeout>到你的Java安全策略來修改。任何未能解析的主機將被記錄,還要注意,在Java安全管理器就緒後,JVM默認緩存負主機名解析時間爲10秒,這能夠經過添加networkaddress.cache.ttl=<timeout>到你的Java安全策略來修改。