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 | # fielddata的内存限制,默认60% |