系统层面

系统层面的调优主要是内存的设定与避免交换内存。ES 安装后默认设置的堆内存是 1GB,这很明显是不够的,那么接下来就会有一个问题出现:我们要设置多少内存给 ES 呢?其实这是要看我们集群节点的内存大小,还取决于我们是否在服务器节点上还是否要部署其他服务。如果内存相对很大,如 64G 及以上,并且不在 ES 集群上部署其他服务,那么建议 ES 内存可以设置为 31G-32G,因为这里有一个 32G 性能瓶颈问题,直白的说就是即使你给了 ES 集群大于 32G 的内存,其性能也不一定会更加优良,甚至会不如设置为 31G-32G 时候的性能。设置 ES 集群内存的时候,还有一点就是确保堆内存最小值(Xms)与最大值(Xmx)的大小是相同的,防止程序在运行时改变堆内存大小,这是一个很耗系统资源的过程。

禁止swap,一旦允许内存与磁盘的交换,会引起致命的性能问题。swap空间是一块磁盘空间,操作系统使用这块空间保存从内存中换出的操作系统不常用page数据,这样可以分配出更多的内存做page cache。这样通常会提升系统的吞吐量和IO性能,但同样会产生很多问题。页面频繁换入换出会产生IO读写、操作系统中断,这些都很影响系统的性能。这个值越大操作系统就会更加积极的使用swap空间。通过:在elasticsearch.yml 中 bootstrap.memory_lock: true, 以保持JVM锁定内存,保证ES的性能。

ES系统方面调优

确定集群CPU占用率高的原因,使用GET_nodes/{node}/hot_threads,如果结果为elasticsearch[{node}][search][T#10]则为查询导致,如果结果为elasticsearch[{node}][bulk][T#1],则为写入导致。

index.merge.scheduler.max_thread_count

在实际调优中,cpu使用率很高,使用SSD替代机械硬盘。SSD与机械磁盘相比,具有高效的读写速度和稳定性。如果不是SSD,建议设置index.merge.scheduler.max_thread_count: 1,即索引merge最大线程数设置为1 个,该参数可以有效调节写入的性能。因为在存储介质上并发写,由于寻址的原因,写入性能不会提升,只会降低。当有多个磁盘时可以设置为对应的数量。
index.refresh_interval

这个参数的意思是数据写入后几秒可以被搜索到,默认是 1s。每次索引的 refresh 会产生一个新的 lucene 段, 这会导致频繁的合并行为,如果业务需求对实时性要求没那么高,可以将此参数调大。

indices.memory.index_buffer_size

如果我们要进行非常重的高并发写入操作,那么最好将它调大一些,index buffer的大小是所有的shard公用的,对于每个 shard来说,最多给512MB,因为再大性能就没什么提升了。ES会将这个设置作为每个shard共享的index buffer,那些特别活跃的shard会更多的使用这个 buffer。默认这个参数的值是10%,也就是jvm堆内存的10%。
translog

ES为了保证数据不丢失,每次index、bulk、delete、update完成的时候,一定会触发刷新translog到磁盘上。在提高数据安全性的同时当然也降低了性能。如果你不在意这点可能性,还是希望性能优先,可以设置如下参数:

es配置 es配置内存大小_运维


这样设定的意思是开启异步写入磁盘,并设定写入的时间间隔与大小,有助于写入性能的提升。

replica数目

为了让创建的es index在每台datanode上均匀分布,同一个datanode上同一个index的shard数目不应超过3个。计算公式: (number_of_shard*(1+number_of_replicas)) < 3*number_of_datanodes每台机器上分配的shard数目,index.routing.allocation.total_shards_per_node: 2

merge相关参数

es配置 es配置内存大小_elasticsearch_02


超时参数

es配置 es配置内存大小_elasticsearch_03


参数调优汇总

es配置 es配置内存大小_调优_04