Elasticsearch优化流程可以分为系统参数优化、集群层面优化、索引层面优化、查询层面优化。本文档主要介绍系统参数优化。
1 文件句柄设置
每个进程默认句柄数只有1000,对Elasticsearch来说不够,建议改成65535
vim /etc/security/limits.conf
#添加如下内容
* - nofile 65535
2 虚拟内存设置
max_map_count定义进程能拥有的内存区域
sysctl -w vm.max_map_count=262144设置bootstrap.mlockall: true,避免使用swapping
vim ./conf/elasticsearch.yml
修改如下内容:
bootstrap.mlockall: true设置memlock最大锁定内存地址空间
vim /etc/security/limits.conf
新增如下内容:
* soft memlock unlimited
* hard memlock unlimited确认文件pam_limits.so位置,并添加到/etc/pam.d/login中
vim /etc/pam.d/login
新增如下内容:
session required /lib64/security/pam_limits.so验证是否生效
curl localhost:9200/_nodes/stats/process?pretty
3 磁盘缓存设置
dirty_ratio
用于指定了当文件系统缓存脏页数量达到系统内存百分之多少时(如10%),系统不得不开始处理缓存脏页(因为此时脏页数量已经比较多,为了避免数据丢失需要将一定脏页刷入外存);在此过程中很多应用进程可能会因为系统处理文件IO而阻塞
建议该参数适当调小。如果cached的脏数据所占比例(这里是占MemTotal的比例)超过这个设置,系统会停止所有的应用层的IO写操作,等待刷完数据后恢复IO。所以万一触发了系统的这个操作,对于用户来说影响非常大的
dirty_background_ratio
用于指定当文件系统缓存脏页数量达到系统内存百分之多少时(如5%)就会触发pdflush/flush/kdmflush等后台回写进程运行,将一定缓存的脏页异步地刷入外存;
vim /etc/sysctl.conf
新增如下内容:
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
4 swap调优
为了保证性能,需要最大可能的使用物理内存。
sudo sh -c 'echo "1">/proc/sys/vm/swappiness'备注:由于linux内核版本3.5开始将0的含义由"除非内存不足,否则不要交换"更改为"从不交换",故建议将值设置为1
该值以前的含义是“除非内存不足,否则不要交换”。自Linux内核版本3.5-rc1起,含义有所不同。该更改被重新移植到许多发行版中,包括内核2.6.32-303的RedHatas。这将值0的含义更改为“从不交换”。出于这个原因,现在建议将值设置为1。
5 磁盘挂载属性设置
磁盘挂载属性设置为noatime,nodiratime。避免每次访问文件都更新access time
vim /etc/fstab
/dev/sda1 /opt/data/1 ext4 defaults,noatime,nodiratime 0 0
/dev/sdb1 /opt/data/2 ext4 defaults,noatime,nodiratime 0 0
#noatime,nodiratime避免每次数据访问时都更新access time信息
6 numa设置
Elasticsearch将占用大量内存且为了性能需要关闭swap,为避免遇到numa陷阱需要关闭numa
numa陷阱。当你的服务器还有内存的时候,发现它已经在开始使用swap了,甚至已经导致机器出现停滞的现象。这个就有可能是由于numa的限制,如果一个进程限制它只能使用自己的numa节点的内存,那么当自身numa node内存使用光之后,就不会去使用其他numa node的内存了,会开始使用swap,甚至更糟的情况,机器没有设置swap的时候,可能会直接死机
#关闭Numa
echo ‘never’ > /sys/kernel/mm/transparent_hugepage/defrag
echo ‘never’ > /sys/kernel/mm/transparent_hugepage/enabled
sysctl –w vm.zone_reclaim_mode=0
#内存不足时,值为0将倾向于从其他节点分配内存;值为1将倾向于从本地节点回收Cache内存




