One of the biggest causes of instability in Elasticsearch is fielddata: field values have to be loaded into memory to make aggregations, sorting and scripting perform as fast as they do.
如上文在Elasticsearch页面上的描述,大的字段数据始终会导致Elasticsearch内存不足(OOM)。因此,我们可以设置 index.fielddata.cache.size 和 index.fielddata.breaker.limit 以防止OOM。这两种设置有什么区别?
他们有关系吗?
例如,My Elasticsearch JVM的总内存为2g。如果我将 index.fielddata.cache.size 设置为1g,但 index.fielddata.breaker.limit 设置为60%(这意味着1.2g)。允许加载到内存的字段数据超出了字段数据缓存的大小。会导致任何错误吗? (Reference Fielddata)
谢谢你。
最佳答案
经过长时间的研究,我找到了答案。
将 index.fielddata.cache.size 设置为1g时。这意味着elasticsearch可以使用多少个字段缓存大小来处理查询请求。但是,当您将 index.fielddata.breaker.limit 设置为60%(平均1.2g)时,如果查询数据大于此大小,elasticsearch将拒绝此查询请求并导致异常。
因此,如果查询数据小于1.2g但大于1g,则elassticsearch将接受此查询请求。达到 index.fielddata.cache.size 后,将刷新旧数据并释放内存以存储新数据。