Elasticsearch-78-fielddata内存控制及circuit breaker短路器

fielddata核心原理

fielddata加载到内存的过程是lazy加载的,对一个分词field执行聚合时,才会加载,field执行聚合时,才会加载(query-time),而且是field-level加载的
一个index的一个field,所有doc都会被加载,而不是少数doc

fielddata内存限制

1
indices.fielddata.cache.size: 20%

在elasticsearch安装目录的config目录下的elasticsearch.yml里面配置

通过这个配置可以限制fielddata占用的内存,超出限制的话,就清除内存中已有的fielddata数据, 默认是无限制的,如果限制的话,可能会导致大量的evict和reload,大量的IO性能损耗,以及内存碎片和GC,不建议使用

监控fielddata内存使用情况

可以通过以下几个请求去查看

1
GET /_stats/fielddata?fields=*

1
GET /_nodes/stats/indices/fielddata?fields=*
1
GET /_nodes/stats/indices/fielddata?level=indices&fields=*

circuit breaker

如果一次query 加载的fielddata超过总内存,就会oom(内存溢出)

circuit breaker(短路器)会估算query要加载的fielddata的大小,如果超出总内存,就短路,query直接失败

短路器的配置也是在elasticsearch.yml里面去配置的

1
2
3
4
5
6
# fielddata的内存限制,默认60%
indices.breaker.fielddata.limit:
# 执行聚合的内存限制,默认40%
indices.breaker.request.limit:
# 综合上面两个,限制在70%以内
indices.breaker.total.limit: