下面用于在10秒内运行的汇总查询。突然间,它需要超过5分钟的时间才能完成。不知道发生了什么变化。
查询:
time curl -XGET http://localhost:9200/metric_alias/metrics/_search?pretty&routing=123456 -d '{
"size": 0,
"query": {
"bool": {
"must": [ {
"term": {
"tenantId": 123456
}
},
{
"regexp": {
"metric_name": {
"value": "[^.]*[.][^.]*"
}
}
} ]
}
},
"aggs": {
"metric_name_tokens": {
"terms": {
"field" : "metric_name",
"include": "[^.]*[.][^.]*",
"execution_hint": "map",
"size": 0
}
}
}
}' -o test.out
我什至尝试在使用以下命令
清除字段数据缓存后运行查询。curl -XPOST 'http://localhost:9200/_cache/clear' -d '{ "fielddata": "true" }'
几个月前,我们更改了这些设置。不要相信我们看到的问题与此问题有关,因为即使清除了字段数据缓存。
也会发生。indices.breaker.fielddata.limit is set to 85%
indices.fielddata.cache.size is set to 75%
我在查询运行时录制了热线。我在此处复制了输出https://gist.github.com/chandraaddala/180E1D7D7DF9E6F232344C1FE0109B01BE
关于如何调试问题的任何想法?
环境:弹性搜索1.7.1。它是一个3个节点簇,带有125克RAM和40个核心。ES的堆大小为31克。Metric_alias仅触摸2个索引(一个不再更新)。大约20GB的数据。运行查询时,我看不到CPU的任何不同和堆积的用法。
根据Elastic.co的doc
indices.fielddata.cache.size
和indices.breaker.fielddata.limit
之间的关系是重要的。如果断路器限制低于缓存大小,则不会驱逐数据。为了使其正常工作,断路器限制必须高于缓存大小。
indices.breaker.fielddata.limit is set to 85%
indices.fielddata.cache.size is set to 75%
我认为您的indices.breaker.total.limit
未设置,默认情况下是70%
。因此,即使您的indices.breaker.fielddata.limit
设置为85%
indices.breaker.total.limit
也限制了其功能。
indices.breaker.total.limit
: 总断路器包装请求和fieldData断路器,以确保两者的组合默认情况下不使用超过70%的堆。
尝试:
- 将
indices.breaker.fielddata.limit
增加到>85%
值。 - 降低
indices.breaker.fielddata.limit
和indices.fielddata.cache.size
小于60%
,因为为什么单个查询需要超过60%的堆?