Elasticsearch 性能调优
主要修改参数
最近几天的主要工作是对于我们当前业务场景下,完成性能调优,主要修改了以下参数的配置,写入性能由最初的8k+,到现在基本达到10K,此时的性能瓶颈已经不在ES本身,主要受限于磁盘IO。
"refresh_interval" : "120s", "index.translog.interval": "60s", "index.translog.durability": "async", "index.translog.sync_interval": "30s", "index.merge.scheduler.max_thread_count": "1", //进行merge操作的最大线程数,对于FS的环境上该值应该为4, "index.merge.policy.max_merged_segment": "1gb", //默认5G "index.merge.policy.floor_segment": "50mb"
结论如下:
进行这次验证部署两个实例,磁盘性能经过多次验证,取的平均值,大概写入约70M/s,单挑doc的字节书大概在400-430左右。
机器配置:16U32G,但是给ES的配置内存为4G(由于当前机器部署的其他应用较多)
10K写入量大约需要5+个核。
我们使用批量写的方式进行写入,一次写入10K条数据。单次几乎是4M的数据量。
配置说明
refresh_interval:周期的大小,决定了此时doc被检索到的周期,主要是来确定事实实时的参数,如果并不要求足够的实时性,其实,完全可以关闭,在doc全部刷新到磁盘后仍然是可以被检索的
index.translog.flush_threshold_ops:当发生多少次操作时进行一次flush。默认是 unlimited。
index.translog.flush_threshold_size:当translog的大小达到此值时会进行一次flush操作。默认是512mb。
index.translog.flush_threshold_period:在指定的时间间隔内如果没有进行flush操作,会进行一次强制flush操作。默认是30m。
index.translog.interval:多少时间间隔内会检查一次translog,来进行一次flush操作。es会随机的在这个值到这个值的2倍大小之间进行一次操作,默认是5s。
index.merge.scheduler.max_thread_count: segment进行merge的线程数,计算方式Math.max(1, Math.min(4, Runtime.getRuntime().availableProcessors() / 2)),如果你的磁盘不是SSD盘,就可以将其调整为1
index.merge.policy.max_merged_segment:最大可以merge的segment,默认5G,将其改为1G,来节约IO。
index.merge.policy.floor_segment:小于这个值的segment,均会被优先进行merge操作,将其调大,最大限度的一次多完成merge操作。