ES性能并非想像中的那么好
ES数据量一大时,特别是第一次搜索的时候耗时会很久(甚至10s以上)。也不要认为改个参数就能改善所有性能慢的场景。
通过ES慢日志可分析查询效率
ES提供了慢日志,但默认是没有开启的。ES中的慢日志主要分两类:索引慢日志、搜索慢日志。如何开启呢?参考如下:
PUT /my_index/_settings{
"" : "10s",
"": "500ms",
"": "5s"
}
ES查询性能优化方案
1、升级硬件配置(硬盘、内存)
对于硬盘建议选用SSD,它比机械硬盘读写速度更快,另外内存需要适时调整。
2、JVM参数调优
要知道ES是用Java开发的,跑在JVM中,如果JVM参数设置不当也会影响ES的性能!ES安装后默认的堆内存是1G,这个值太小了,需要适当调大。
3、加大文件系统缓存设置
ES依懒底层的FileSystem Cache,文件系统缓存值若太小则会导致ES查询时会从硬盘中查询,效率低。若文件系统缓存大小设置合理,则很多查询可以直接从缓存内查询。
4、减少副本数量
ES默认副本是3个,副本越多虽然能提高集群的可用性,但是也增加了搜索的并发数、也会影响索引写入效率。所以建议副本不要过多,一般1~3个足够了。
5、禁止深度分页
ES它的分页效率很低(若每页10条,查询第100页时,ES实际查询的是每个Shard中的1000条数据进行处理后再返回第100页里的10条数据),页数越靠后,CPU消耗越大,查询效率越低!所以我们要禁止深度分页。
6、Filter 比 Query 效率好
Filter查询结果可以缓存,而且不需要像Query那样计算相关性分值,所以Filter效率更高。
7,服务器内存要大一点,因为索引加载需要大量内存,并且最大最小内存设置相同值,防止GC时候的大量stop the world!
8,设置合理的索引刷新时间,indwx.fresh_interval如果设置过大,索引查不到容易导致异常,设置太小,服务器压力会很大!
9,禁用_all,打开会导致拷贝增加,查询效率变低!
10,防止设置过多的分片副本,增大合并时间,影响查询效率!
11,优化查询返回字段,减少内存占用!
12,添加查询缓存!