欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

elasticsearch 1.x优化

程序员文章站 2022-03-02 17:28:07
...
关于我,邯郸人
对这类话题感兴趣?欢迎发送邮件至donlianli@126.com
 
本博文为Elasticsearch Server2nd的部分第7章部分章节的翻译,版权归原作者。

设置Filter cache

缓存是提高性能的很重要的手段,es中的filter cache能够把搜索时的filter条件的结果进行缓存,当进行相同的filter搜索时(query不同,filter条件相同),es能够很快的返回结果。这是因为第一次计算完filter后,es就把结果存储到了缓存中,下次搜索时,es就不用再计算。

Esfilter cache有两种,一种是node级别的cache(filter cache默认类型),一种是index级别的filter cacheNode级别的cache被整个node共享,并且可以使用百分比设置,对应的属性为indices.cache.filter.size,这个属性的值可以是百分比,也可以是具体的大小。Index级别的cache,顾名思义,就是针对单个索引的大小。Es官方并不推荐使用这种设置,因为谁也无法预测索引级别的缓存到底有多大(可能非常大,超过了node的对内存),一个索引可能分布在多个node上面,而多个node的结果如果汇总到一个node上,其结果可想而知。

设置Field cache

当对字段排序或者对字段做聚合(如facet)时,字段缓存(Field cache)非常重要。Es会将这些待排序或者聚合字段都加载到内存,以提高对这些字段的快速访问。注意,将字段都加载到内存是非常耗费资源的,所以,你应该保证field cache足够大,以足以将所有的结果都缓存起来,下次排序或facet时不用再次从磁盘进行加载。

可以通过设置indices.fielddata.cache.size为具体的大小,比如2GB,或者可用内存的百分比,比如40%。请注意,这个属性是node级别(不是index级别的).当这个缓存不够用时,为了跟新的缓存对象腾出空间,原来缓存的字段会被挤出来,这会导致系统性能下降。所以,请保证这个值足够大,能够满足业务需求。另外,如果你没有设置这个值,es默认缓存可以无限大。所以,在生产环境注意要设置这个值。

同时,我们也可以为field cache指定过期时间,系统默认缓存不过期。可以通过设置indices.fielddata.cache.expire10m,表示缓存10分钟过期。Es建议,最好不要设置过期时间,因为将字段加载到内存是很浪费资源的。

设置circuit breaker

Circuit breaker,断路器。这个和field cache有关系。断路器可以估算待加载的field的大小。通过断路器,可以防止将特别大的field加载到内存,导致内存溢出。断路器发现待加载的filed超过java的对内存时,会产生一个异常,防止field的继续加载,从而起到保护系统的作用。有两个属性可以设置断路器,一个是indices.fielddata.breaker.limit,这个值默认是80%。这个值可以动态修改,通过集群设置的api就可以修改。80%就是说,当待加载的field超过es可用堆内存的80%时,就会抛一个异常。

另一个属性是indices.fielddata.breaker.overhead,默认值为1.03es将使用这个值乘以field实际的大小作Field估算值。

设置Index Buffers

indices.memory.index_buffer _size,这个值默认为10%,即堆内存的10%会被用作index时的缓存,这个值可以设置百分比也可以是固定的大小。缓冲自然是越大越好。但记得千万不能超过可用的对内存,并且要跟filter cache和filed cache保证在一个合理的比例。

设置Index Refresh rate(索引刷新频率)

index.refresh_interval,默认为1秒。即被索引的数据,1秒之后才能够被搜索到。这个时间越小,搜索和索引的性能就越低。这个时间越大,索引和搜索的性能就越高。es建议,在bulk index非常大的索引数据时,将此值设置为-1,索引完毕之后再将此值修改回来。

综合考虑

记住,对ES来说,缓存(caches)与缓冲(buffers)是提高索引(index)和搜索(query)性能的关键因素。

 

在我们优化es之前,我们必须时刻牢记一点,es需要足够多的内存,越多越好。但是,也不能把所有的内存都分配给es。分配给es的内存最好是保持在物理内存的50-60%左右,因为os也需要内存支持用户进程,比如分配线程,io缓存等。但是,物理内存的50-60%也不是唯一标准。假如你的内存有256G,即便和OS预留10%的内存,也有25G,足够操作系统使用。另外,最好设置XmxXms一样大,避免heap sizeresizing

做性能测试时,在相同的情形下,测试结果应该是可以重现的。你做的任何参数的修改,都应该使用进行性能测试,看性能是否有所提高。以性能测试为检验标准,是我们进行优化的必要前提。