101_es生產(chǎn)集群部署之重要的操作系統(tǒng)設置(swapping、virutal memory等)

101_es生產(chǎn)集群部署之重要的操作系統(tǒng)設置(swapping、virutal memory等)

1、系統(tǒng)的重要配置

理想情況下,es應該單獨在一個服務器上運行,能夠使用服務器上的所有資源。為了達到上述目標,我們需要配置操作系統(tǒng),來允許用戶運行es并且獲取比默認情況下更多的資源。

在生產(chǎn)環(huán)境中下面的一些設置必須配置一下:

(1)禁止swapping
(2)確保擁有足夠的虛擬內存
(3)確保擁有足夠的線程數(shù)量

開發(fā)模式 vs 生產(chǎn)模式

默認情況下,es會假設你是在開發(fā)模式下運行的。如果上面的任何配置沒有正確的設置,那么會輸出一些warning到日志文件中,但是我們還是可以啟動es進程的。

但是如果我們配置了網(wǎng)絡設置,比如network.host,es會認為我們是運行在生產(chǎn)環(huán)境中的,然后就會將上述warning升級為exception。這些exception會阻止我們的es節(jié)點啟動。這是一個重要的安全保障措施來確保我們不會因為錯誤的配置了es server,而導致數(shù)據(jù)丟失。

2、配置系統(tǒng)設置

在/etc/security/limits.conf中,可以配置系統(tǒng)設置

也可以用ulimit臨時配置系統(tǒng)設置

在linux操作系統(tǒng)中,ulimit可以用來臨時的改變資源限制。通常需要用root權限來設置ulimit。

舉例,如果要設置file descriptor為65536,可以用如下的命令來設置:

ulimit -n 65536

但是在linux操作系統(tǒng)中,實際上永久性的資源限制可以通過編輯/etc/security/limits.conf文件來設置。比如要設置file descriptor,可以再limits.conf中加入下面的行:

elasticsearch - nofile 65536

在下一次elasticsearch用戶開啟一個新的會話時就會生效

設置jvm option

一般建議通過jvm.options配置文件來設置es的jvm option。默認的地址是config/jvm.options

每行是一個jvm argument

此外,如也可以通過ES_JAVA_OPTS環(huán)境變量來設置jvm option,比如下面的命令:

export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir"

3、禁止swapping

大多數(shù)操作系統(tǒng)都會使用盡量多的內存來進行file system cache,并且盡量將不經(jīng)常使用的java應用的內存swap到磁盤中去。這會導致jvm heap的部分內存,甚至是用來執(zhí)行代碼的內存頁被swap到磁盤中去。

swapping對于性能來說是非常差勁的,為了es節(jié)點的穩(wěn)定性考慮,應該盡量避免這種swapping。因為swapping會導致gc過程從毫秒級變成分鐘級,在gc的時候需要將內存從磁盤中swapping到內存里,特別耗時,這會導致es節(jié)點響應請求變得很慢,甚至導致es node跟cluster失聯(lián)。在一個彈性的分布式系統(tǒng)中,讓操作系統(tǒng)kill掉某一個節(jié)點,是很高效的。

有三種方法可以disable swapping。推薦的option是徹底禁用swap,如果做不到的化,也得盡量最小化swappiness的影響,比如通過lock memory的方法。

(1)禁用所有的swapping file

通常來說,es進程會在一個節(jié)點上單獨運行,那么es進程的內存使用是由jvm option控制的。

可以使用下面的命令臨時性禁止swap:swapoff -a

要永久性的禁止swap,需要修改/etc/fstab文件,然后將所有包含swap的行都注釋掉

(2)配置swappiness

另外一個方法就是通過sysctl,將vm.swappiness設置為1,這可以盡量減少linux內核swap的傾向,在正常情況下,就不會進行swap,但是在緊急情況下,還是會進行swap操作。sysctl -w vm.swappiness=1

(3)啟用bootstrap.memory_lock

最后一個選項,就是用mlockall,將es jvm進程的address space鎖定在內存中,阻止es內存被swap out到磁盤上去。在config/elasticsearch.yml中,可以配置:

bootstrap.memory_lock: true

GET _nodes?filter_path=**.mlockall,通過這行命令可以檢查mlockall是否開啟了

如果發(fā)現(xiàn)mlockall是false,那么意味著mlockall請求失敗了。會看到一行日志,unable to lock jvm memory。

最大可能的原因,就是在linux系統(tǒng)中,啟動es進程的用戶沒有權限去lock memory,需要通過以下方式進行授權:

ulimit -l unlimited

/etc/security/limits.conf,memlock設置為unlimited

另外一個原因可能是臨時目錄使用noexec option來mount了??梢酝ㄟ^指定一個新的臨時目錄來解決

export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djava.io.tmpdir=/path/to/temp/dir"

當然也可以通過在jvm.options文件中來設置java.io.tmpdir

4、虛擬內存

es使用hybrid mmapfs / niofs目錄來存儲index數(shù)據(jù),操作系統(tǒng)的默認mmap count限制是很低的,可能會導致內存耗盡的異常。

需要提升mmap count的限制:sysctl -w vm.max_map_count=262144

如果要永久性設置這個值,要修改/etc/sysctl.conf,將vm.max_map_count的值修改一下,重啟過后,用sysctl vm.max_map_count來驗證一下數(shù)值是否修改成功

es同時會用NioFS和MMapFS來處理不同的文件,我們需要設置最大的map刷另,這樣我們才能有足夠的虛擬內存來給mmapped文件使用,可以用sysctl來設置:sysctl -w vm.max_map_count=262144。還可以再/etc/sysctl.conf中,對vm.max_map_count來設置。

5、設置線程的數(shù)量

es用了很多線程池來應對不同類型的操作,在需要的時候創(chuàng)建新的線程是很重要的。要確保es用戶能創(chuàng)建的最大線程數(shù)量至少在2048以上。

可以通過ulimit -u 2048來臨時設置,也可以在/etc/security/limits.conf中設置nproc為2048來永久性設置。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容