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
有任何問題,或是想看新主題?
聯絡我們