B i M A P

Elasticsearch|Modify Linux Setting for Best Performance

elasticsearch logo



Disable swapping

大部份的狀況 Elasticsearch 會獨立安裝在 Server 上,因為 ES 以 Java 為開發基礎,所以 Memory 的消耗量會由 JVM 來做控制,所以其實並不需要 Server 有 swap 的機制,以確保 ES 保有最好的效能。

我們可以暫時關閉 swap,所以:

sudo swapoff -a

執行完上面的指令,並不需要重新啟動 Elasticsearch 的服務,但如果要永久停用該設定,要手動修改 /etc/fstab 的設定檔,將 swap 相關的設定註解,所以:

vi /etc/fstab 取消掉開機啟動swap
#/dev/mapper/centos-swap swap swap defaults 0 0

如果是 Windows 的用戶,可以禁用分頁文件來達成類似的效果,所以:

System Properties → Advanced → Performance → Advanced → Virtual memory


Configure swappiness

如果不希望停用 swap 的話,在 Linux OS 中,有另一個 vm.swappiness 參數可以設置為 0,這個設定可以讓 OS 在正常服務的狀況下,不要做 swap 交換,但依舊可以在 Memory 耗盡時啟用 swap,所以:

vi /etc/sysctl.conf

vm.swappiness = 0


Configuring system settings

ulimit

我們可以在 Linux OS 上,調整 ulimit 的設定,通常會先以 root 角色進行設定,再切換至會啟動 elasticsearch 的用戶。我們這邊將開啟檔案的上限調為 65536,所以:

sudo su
ulimit -n 65535
su elasticsearch


/etc/security/limits.conf

我們可以讓系統針對 elasticsearch 開放一些限制,比如檔案開啟上限(nofile)、執行緒的使用上限(nproc),因此我們可以永久性設定某些參數,共有兩個地方需要設定,所以:

vi /etc/security/limits.conf 
elasticsearch - nofile 65536 elasticsearch soft nproc 4096 elasticsearch hard memlock unlimited elasticsearch soft memlock unlimited

vi /etc/security/limits.d/20-nproc.conf
soft nproc 65536


Systemd configuration

Linux 上所啟用的服務會有一些默認限制,像是 memory,我們可以做一些調整,所以:

sudo systemctl edit elasticsearch

[Service]
LimitMEMLOCK=infinity

sudo systemctl daemon-reload


/etc/sysctl.conf

fs.file-max

      • 打開檔案的上限數,通常設為 65536。

vm.swappiness

      • 設定當 memory 達多少以下,再啟動 swap 機制,通常可以為 0。

vm.max_map_count

      • ES 預設使用 mmapfs 目錄來存放 indices,通常預設的 mmap  使用上限太低,導致 Memory 耗用太多,因此可以調高

kernel.pid_max

      • Linux 可以開放的最大執行緒數量,如果沒有調高此參數,ES 服務可開啟最大執行緒的量,還是會受到這個參數的限制。
vi /etc/sysctl.conf 
fs.file-max=65536 vm.swappiness=0 vm.max_map_count=262144 kernel.pid_max=65535




有任何問題,或是想看新主題? 聯絡我們

延伸閱讀
winstonlu的大頭照
ELK 達人

我們致力於 ELK 的各種應用,協助企業建置相關服務。我們也提供基於 ELK 的各種解決方案,有任何問題,歡迎加入我們的官方 Line,或來信詢問,期待與您面對面的機會。