elasticsearch 1.x优化

关于我, 邯郸人
对这类话题感兴趣?欢迎发送邮件至[email protected]
 
本博文为 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

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

 

猜你喜欢

转载自donlianli.iteye.com/blog/2115979
今日推荐