elasticsearch性能调优
一、配置文件调优
-
内存锁定
bootstrap.memory_lock:true 允许JVM锁住内存,禁止操作系统交换出去。 -
设置indices的内存熔断相关参数,防止写入或者查询压力过高导致OOM
indices.breaker.total.limit:50%,集群级别的断路器,默认为jvm堆的70%。
indices.breaker.request.limit:10%,单个request的断路器限制,默认为jvm堆的60%;
indices.breaker.fielddata.limit:10%,fielddata breaker限制,默认为jvm堆的60%。
indices.queries.cache.size: 5%,控制过滤器缓存的内存大小,避免查询占用过多的jvm 内存
具体比例数值可根据具体情况设置
二、从系统上调优
-
根据官方建议选择对应的JDK版本
-
JDK配置:-xms和-xmx设置为相同的值,避免在允许过程中再进行内存分配,同时,如果系统内存小于64G,建议设置略小于机器内存的一半,同时,JVM heap建议不要超过32G,否则会因为内存指针压缩导致内存浪费。
-
关闭交换分区,防止内存交换导致性能下降
-
加大文件句柄数。
ulimit -n 65536 -
mmap
sysctl -w vm.max_map_count=262144 或者你可以在 /etc/sysctl.conf 通过修改 vm.max_map_count 永久设置它。
三、从磁盘上调优
-
磁盘挂载
mount -o noatime,data=writeback,barrier=0,nobh /dev/sd* /esdata* 其中,noatime,禁止记录访问时间戳;data=writeback,不记录journal;barrier=0,因为关闭了journal,所以同步关闭barrier;nobh,关闭buffer_head,防止内核影响数据IO。 -
其它
使用 RAID 0。条带化 RAID 会提高磁盘I/O,代价显然就是当一块硬盘故障时整个就故障了,不要使用镜像或者奇偶校验 RAID 因为副本已经提供了这个功能。
另外,使用多块硬盘,并允许 Elasticsearch 通过多个 path.data 目录配置把数据条带化分配到它们上面。不要使用远程挂载的存储,比如 NFS 或者 SMB/CIFS。这个引入的延迟对性能来说完全是背道而驰的。