官網說明:
elasticsearch官網建議生產環境需要設置bootstrap.memory_lock: true
官網的解釋 是:發生系統swapping的時候ES節點的性能會非常差,也會影響節點的穩定性。所以要不惜一切代價來避免swapping。swapping會導致Java GC的周期延遲從毫秒級惡化到分鍾,更嚴重的是會引起節點響應延遲甚至脫離集群。
所以最好限制住elasticsearch占用的內存情況,可選少用swap
錯誤內容:
開啟bootstrap.memory_lock: true
后,在Elasticsearch集群啟動的時候,會報如下錯誤
ERROR: bootstrap checks failed memory locking requested for elasticsearch process but memory is not locked
我使用docker-compose布署的時候,集群一直在重啟失敗間循環!
解決方法:
方案1:
此方案適用於非systemd管理的linux發行版,centos 6及以下可以僅通過這個方案解決
臨時解決方法:
ulimit -l unlimited
永久解決方法:
root權限編輯/etc/security/limits.conf
$ sudo vim /etc/security/limits.conf
添加如下內容,保存退出
* soft memlock unlimited
* hard memlock unlimited
這里的*代表的是所有用戶名稱,可以更換為指定用戶名
另:這里有個坑就是如果/etc/security/limits.d
文件夾下的有配置文件,那么會覆蓋剛才修改的文件,所以請確保該目錄沒有其它文件,如有請聯系運維人員確認刪除
修改/etc/sysctl.conf
sudo echo "vm.swappiness=0" >> /etc/sysctl.conf
這個參數的作用是告訴Linux內核盡少的使用swap分區,不等於禁用swap,通過少使用swap來提高性能。
如果想立即生效而不是重啟之后讓sysctl.conf生效,請使用sysctl -p
重新登錄或重啟服務器方可生效
方案2:
適用於systemd管理的發行版,有文章提到centos 7需要使用此方案,本人使用debian 9.9.0 親測解決問題,推薦先完成上邊的方案后嘗試本方案
這里還是推薦使用上邊方法的第3步,盡少使用swap分區
在Centos7系統中,使用Systemd替代了之前的SysV。/etc/security/limits.conf文件的配置作用域縮小了。/etc/security/limits.conf的配置,只適用於通過PAM認證登錄用戶的資源限制,它對systemd的service的資源限制不生效。因此登錄用戶的限制,通過/etc/security/limits.conf與/etc/security/limits.d下的文件設置即可。
對於systemd service的資源設置,則需修改全局配置,全局配置文件放在/etc/systemd/system.conf和/etc/systemd/user.conf,同時也會加載兩個對應目錄中的所有.conf文件/etc/systemd/system.conf.d/.conf和/etc/systemd/user.conf.d/.conf。system.conf是系統實例使用的,user.conf是用戶實例使用的。
全局生效方式:
sudo vim /etc/systemd/system.conf
最下方添加
DefaultLimitNOFILE=65536
DefaultLimitNPROC=32000
DefaultLimitMEMLOCK=infinity
保存, 重啟系統
當然由於我是使用的docker,而不是包管理器安裝的,給出的是全局的方案
局部生效方式:(針對包管理器安裝elasticsearch的形式)
sudo systemctl edit elasticsearch
此命令會在/etc/systemd/system下創建elasticsearch.service.d/override.conf文件
添加如下內容
[Service]
LimitMEMLOCK=infinity
保存,退出,執行如下命令生效
sudo systemctl daemon-reload
如未生效,請嘗試重啟系統
壓縮包版測試
針對使用tar.gz包,指定內存參考如圖
我們按圖索驥使用命令ES_JAVA_OPTS="-Xms512m -Xmx512m" ./bin/elasticsearch
如果此時出現
[2019-06-20T07:01:36,305][WARN ][o.e.b.JNANatives ] [node-1] Unable to lock JVM Memory: error=12, reason=Cannot allocate memory
[2019-06-20T07:01:36,340][WARN ][o.e.b.JNANatives ] [node-1] This can result in part of the JVM being swapped out.
[2019-06-20T07:01:36,343][WARN ][o.e.b.JNANatives ] [node-1] Increase RLIMIT_MEMLOCK, soft limit: 16777216, hard limit: 16777216
[2019-06-20T07:01:36,343][WARN ][o.e.b.JNANatives ] [node-1] These can be adjusted by modifying /etc/security/limits.conf, for example:
# allow user 'hellxz' mlockall
hellxz soft memlock unlimited
hellxz hard memlock unlimited
請再嘗試加上第一種方案,兩種方案同時使用
以上就是這些內容,希望能對讀者有所幫助
聲明,禁止布布扣、碼迷、馬開東、01海、colabug等網站復制轉發此文章,其他請保留文章出處