ES CPU和磁盘IO升高
问题
ES监控出现偶尔的波动,CPU和磁盘IO升高
有时候在凌晨,业务请求比较低,也没有慢查询,GC也比较正常,没有出现Full GC
ES内部的merge segment会占用CPU和磁盘资源,怀疑是这个导致,现针对merge segment做一下优化;
优化
- ES是准实时的搜索,往ES插入数据时,先会写内存,内存的数据不可搜索,会定时将内存中的数据flush到磁盘,默认时间是1S
- 1S的数据写成一个segment文件
- 每个Segment文件不可修改,有几个线程去merge,把小文件merge成大文件
所以可以从两个角度优化:
- 降低生成segment文件的速度,我觉得我们的搜索不需要1S的实时度,改成改成3S(内存数据如果丢失,ES也有transaction log来恢复),降低segment数量
curl -XPUT localhost:9200/test/_settings -d '{ "index" : { "refresh_interval" : "3s" } }'
- 降低merge的线程数,默认的线程数:Math.max(1, Math.min(4, Runtime.getRuntime().availableProcessors() / 2)),但是如果是机械硬盘,ES推荐将线程数改成:1
https://www.elastic.co/guide/en/elasticsearch/reference/2.3/index-modules-merge.html
PUT /_cluster/settings { "persistent" : { "index.merge.scheduler.max_thread_count" : 1 } }