
如果您在针对_id主键或开启fielddata的text类型字段做排序、聚合查询、脚本查询等操作时,遇到搜索结果返回慢、页面加载延迟等体验问题,可以优先根据本文查看fielddata内存使用情况,如果fielddata内存使用率较高,可以参考本文定位并解决该问题。
大量Elasticsearch(ES)集群运维案例显示,fielddata内存使用率越小越好,fielddata不需要占用明显的堆内存。但在Elasticsearch(ES)运维场景中,经常会遇到fielddata内存使用率高,严重时导致整个集群不可用的监控场景。
fieldata缓存主要包含field data和global ordinals,占用fielddata的业务场景主要包含:
说明
前两个场景占用fielddata缓存较多,且影响较大,请优先关注。
_id主键做排序、agg查询和脚本查询操作。
解决方案:_id进行聚合、排序和脚本操作,建议将_id数据复制到开启doc_values的字段进行对应操作。_id查询数据时,下拉提示功能会自动触发聚合。
建议在Kibana > StackManagement > 高级设置中关闭filterEditor:suggestValues,避免在Kibana中根据主键进行搜索时,执行大量_id字段的聚合分析。

Grafana监控看板
说明
通过自建的Elasticsearch_exporter 可以监控采集到fielddata内存使用指标。

GET _cat/nodes?v&h=ip,heap.percent,heap.current,heap.max,ram.current,ram.percent,fielddata.memory_size 
通过线程分析当前集群正在处理哪类耗时任务,以便聚焦根因定位。
GET _nodes/hot_threads通过以下结果可以看到,热线程正在处理fielddata.ordinals.GlobalOrdinalsBuilder,即在构建全局序数。

您可以通过fielddata API和日志两种方式,分析导致fielddata内存占用高问题的原因。
执行以下命令,获取占用fielddata内存占用高的字段,分析和业务的哪类查询相关。
GET _cat/fielddata?v&s=size:desc预期结果如下。

例如以下日志中存在查询时按照_id排序的操作,导致fielddata内存占用高。

您可以通过以下方案,临时解决fielddata内存占用高的问题:
POST _cache/clear?fielddata=true重要:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。