私信 运维笔谈,回复 “阿里云k8s” 可以获取 《阿里云Kubernetes项目实战手册》PDF。
前天有个朋友告诉我,他们生产跑的Elasticsearch 集群突然 fielddata_memory指标急剧增加,导致堆内存不够用,最终导致日志延迟堆积了。
那么fielddata_memory在ES里是个什么类型的参数呢,它的作用又是什么呢?
Elasticsearch中的field data是一种查询式内存数据结构,当对文本(text)字段进行排序、聚合或脚本访问时,这种数据结构会被创建并存储在Java堆内存中。
fielddata_memory内存急剧增加,以下是可能出现的原因:
1. 复杂查询
如果执行了复杂的查询,特别是那些涉及对text类型字段进行排序、聚合或脚本计算的查询,这些操作会触发fielddata的加载,从而增加fielddata缓存的内存使用量。
2. 查询量激增
当Elasticsearch集群承受的查询负载突然增加时,比如在高流量时段或遇到突发请求时,更多的查询会尝试加载 field data,导致内存使用量迅速上升。
3. 配置不当
indices.fielddata.cache.size设置得过高,导致Elasticsearch允许fielddata缓存占用更多的内存。虽然这可以提高查询性能,但也会增加内存溢出的风险。我朋友那边配置的是堆内存的30%,看来是设置的过高了。
我们可以通过以下命令查看哪个字段占用比较多。
GET /_cat/fielddata?v&fields=*假如要快速恢复故障,可以使用一个暴力手段(谨慎使用)直接清掉全部缓存。
POST _cache/clear