段合并是很消耗计算资源和磁盘IO的操作,特别是出现比较大的段合并。 当出现段合并的速度落后于索引写入的速度,Elasticsearch为了避免出现堆积的段数量爆发,会降低单个线程的索引写入速度,并且会在INFO的log里记录“now throttling indexing“
Elasticsearch默认比较保守,不想让搜索的性能被后台的段合并影响,默认的段合并速率限制比较低,默认是20MB/s,但如果使用的是SSD,可以考虑把这个参数设置到100-200MB/s
PUT /_cluster/settings { "persistent" : { "indices.store.throttle.max_bytes_per_sec" : "100mb" } } 123456 123456如果你只是用bulk导入数据而不关注查询性能,可以关闭合并的阈值
PUT /_cluster/settings { "transient" : { "indices.store.throttle.type" : "none" } } 123456 123456然后在导入完数据之后恢复成“merge”来恢复这个阈值设置
如果是机械硬盘,你需要增加下面的配置到elasticsearch.yml中
index.merge.scheduler.max_thread_count: 1 1 1机械硬盘的并发IO性能较差,我们需要减少每个索引并发访问磁盘的线程数,这个设置会有max_thread_count+2个线程并发访问磁盘 如果是SSD可以忽略这个参数,默认线程数是Math.min(3, Runtime.getRuntime().availableProcessors() / 2),对于SSD来说没有问题。
可以增大index.translog.flush_threshold_size参数,默认是200M,可以增大到如1GB。增大这个参数可以允许translog在flush前存放更大的段(segment);更大的段的创建会减少flush的频率,并且更大的段合并越少,会减少磁盘IO,索引性能更高。