龙空技术网

elasticsearh缓存及使用Breaker限制内存使用

top10000 132

前言:

今天小伙伴们对“eslock文件”大致比较注意,朋友们都想要知道一些“eslock文件”的相关内容。那么小编在网摘上搜集了一些关于“eslock文件””的相关文章,希望咱们能喜欢,你们快快来学习一下吧!

ES的缓存主要分成三大类

Node Query Cache (Filter Context)Shard Query Cache (Cache Query的结果)Fielddata Cache

Node Query Cache

每一个节点有一个Node Query 缓存

由该节点的所有Shard共享,只缓存Filter Context相关内容Cache 采用LRU算法

静态配置,需要设置再每个Data Node上

Node Level - indices.queries.cache.size:"10%"Index Level - index.queries.cache.enabled: true

Shard Request Cache

缓存每个分片上的查询结果

只缓存设置了size=0的查询对应的结果。不会缓存hits。但是会缓存聚合 和建议cache key: lru算法,将整个json串查询串作为key,与json对象的顺序相关静态配置:数据节点:indices.requests.cache.size: "1%"

Fielddata Cache

除了text类型,默认都采用doc-values。节约了内存:聚合的global ordinals 页保存在Fielddata cache中

text类型的字段需要打开Fileddata 才能对其进行聚合和排序:text经过分词,排序和聚合效果不佳,建议不要轻易使用

配置:可以控制indices.fielddata.cache.size避免产生GC (默认无限制)

缓存失效

Node Query Cache: 保存的是segment级缓存命中的结果。segment被合并后,缓存会失效

Shard Request Cache: 分片Refresh时候,shard request cache 会失效。如果shard对应的数据频繁发生变化,该缓存的效率会很差

Fielddata Cache: segment被合并后,会失效

管理内存的重要性

es高效运维依赖于内存的合理分配:可用内存的一半分配给jvm,一半留给操作系统,缓存索引文件

内存引发的问题:

长时间gc,影响节点,导致集群响应缓慢

oom导致丢节点

诊断内存状况

一些常见的内存问题

segments 个数过多,导致full gc

现象:集群整体响应缓慢,也没有特别多的数据读写。但是发现节点在持续进行full gc

分析:查看es的内存使用,发现segments.memory占用很大空间

解决:通过force merge 把segments合并成一个

建议:对于不再写入和更新的索引,可以将其设置成只读。同时,进行force merge操作。如果问题依然存在,则需要扩容。此外对索引进行force merge还可以减少global_ordinal数据结构的构建,减少对fielddata cache的开销

fielddata cache过大,导致full gc

现象:集群整体响应缓慢,也没有特别多的数据读写。但是发现节点再持续进行full gc

分析:查看es的内存使用,发现fielddata.memory.size 占用很大空间。同时,数据不存在写入和更新,也执行过segments merge

解决:将indices.fielddata.cache.size 设小,重启节点,堆内存恢复正常

建议:fielddata cache的构建比较重,es不会主动释放,所以整个值应该设置的保守一些。如果业务上确实由需要,可以增加节点扩容。

复杂的嵌套聚合,导致集群full gc

现象:节点响应缓慢,持续进行full gc

分析:导出dump分析。发现内存中大量bucket对象,查看日志,发现复杂的嵌套聚合

解决:优化聚合

建议:在大量数据集上进行嵌套聚合查询,需要很大的堆内存来完成。如果业务场景确实需要。则需要增加硬件扩展。同时为了避免这类查询影响整个集群,需要设置circuit break 和 seach.max_buckets的数值

circuit breaker

包含多种断路器,避免不合理操作引发的oom,每个断路器可以指定内存使用限制

parent circuit breaker :设置所有的熔断器可以使用的内存总量fielddata circuit breaker : 加载fielddata所需要的内存request circuit breaker: 防止每个请求数据结构超过一定的内存(例如:聚合计算的内存)in flight circuit breaker: request中的断路器accounting request circuit breaker :请求结束后不能释放对象所占用的内存

circuit breaker统计信息

标签: #eslock文件