ES5.3聚合内存溢出bug
yayg2008 发表了文章 • 1 个评论 • 5371 次浏览 • 2018-06-13 20:48
有以下DSL
json<br /> {<br /> "size" : 0,<br /> "query" : { },<br /> "_source" : false,<br /> "aggregations" : {<br /> "aggData" : {<br /> "terms" : {<br /> "field" : "url",<br /> "size" : 200,<br /> "min_doc_count" : 1,<br /> "shard_min_doc_count" : 0,<br /> "show_term_doc_count_error" : false,<br /> "order" : [<br /> {<br /> "PV" : "desc"<br /> }<br /> ]<br /> },<br /> "aggregations" : {<br /> "PV" : {<br /> "cardinality" : {<br /> "field" : "userssid"<br /> }<br /> }<br /> }<br /> }<br /> }<br /> }<br />
目的是对用户访问的URL进行分组统计,按独立用户数来排序。
执行后,data节点频繁FGC,内存无法回收,随即OOM,然后data节点脱离,集群变为red。
最初以为是cardinality精度问题导致内存使用过多,随即将precision_threshold设置为100,再次执行,内存使用量确实少了很多,但是还是用到GB级别。为了确认是否是cardinality问题,去掉外层聚合,直接执行
json<br /> "aggregations" : {<br /> "PV" : {<br /> "cardinality" : {<br /> "field" : "userssid"<br /> }<br /> }<br /> }<br />
发现响应非常快,而且内存占用只有KB级别。
再次单独执行外部聚合,发现也非常快,于是猜测是order导致,将order去掉,果然,如丝般顺滑,再也没有OOM。
为了解决这种OOM,首先想到的是熔断器。默认indices.breaker.request.limit配置是60%。改成10%后,触发熔断,集群正常,但是多点几次之后,data还是出现OOM了。
于是逐步调试,发现每执行1次,内存就增加一点,熔断返回后并没有被回收,直到OOM。基本确定是这里的order导致内存泄露了。
就在此时,同事反馈在5.6不会有这个问题,于是去查release note,果然在[5.5的版本](https://www.elastic.co/guide/e ... 0.html)发现fix了这个问题。[问题描述](https://github.com/elastic/elasticsearch/pull/24941)。
这个bug的根本原因是:
<br /> terms aggregations at the root level use the global_ordinals execution hint by default.<br /> When all sub-aggregators can be run in breadth_first mode the collected buckets for these sub-aggs are dense (remapped after the initial pruning).<br /> But if a sub-aggregator is not deferrable and needs to collect all buckets before pruning we don't remap global ords and the aggregator needs to deal with sparse buckets.<br /> Most (if not all) aggregators expect dense buckets and uses this information to allocate memories.<br /> This change forces the remap of the global ordinals but only when there is at least one sub-aggregator that cannot be deferred.<br />
解决方案:
1,升级到5.5以上版本;
2,DSL增加"execution_hint":"map",属性。
```json
{
"size" : 0,
"query" : { },
"_source" : false,
"aggregations" : {
"aggData" : {
"terms" : {
"field" : "url",
"size" : 200,
"execution_hint":"map",
"min_doc_count" : 1,
"shard_min_doc_count" : 0,
"show_term_doc_count_error" : false,
"order" : [
{
"PV" : "desc"
}
]
},
"aggregations" : {
"PV" : {
"cardinality" : {
"field" : "userssid"
}
}
}
}
}
}
ELK采集不同项目的日志,会不会存在日志打印到别的系统而获取不到的情况
strglee 回复了问题 • 2 人关注 • 1 个回复 • 2503 次浏览 • 2018-06-13 18:55
按天创建索引问题
531651225@qq.com 回复了问题 • 5 人关注 • 3 个回复 • 7499 次浏览 • 2018-06-13 14:40
spring-data-elasticsearch 如何让es自动生成_id
回复redhat 发起了问题 • 1 人关注 • 0 个回复 • 4617 次浏览 • 2018-06-13 10:15
业务数据量与ES集群规模及配置的对应关系大致是怎样?
yang009ww 回复了问题 • 9 人关注 • 4 个回复 • 10609 次浏览 • 2018-06-22 16:42
Nested 存储对象型数组,怎么筛选满足多个key对应多个value
strglee 回复了问题 • 4 人关注 • 1 个回复 • 4264 次浏览 • 2018-06-12 19:11
Elasticsearch 6中为什么移除了对groovy script的支持
yangruideyang 回复了问题 • 2 人关注 • 3 个回复 • 5664 次浏览 • 2018-06-12 11:18
ES 5.1.1 每到固定时间点就会shard failed
highmoutain 回复了问题 • 5 人关注 • 5 个回复 • 2663 次浏览 • 2018-06-13 10:54
es集群5.6.x版滚动升级时插件怎么处置
shwtz 回复了问题 • 5 人关注 • 3 个回复 • 5945 次浏览 • 2018-06-12 11:30
es怎么实现查询es中的2个type,2个type之间没有关系,实现全局搜索,用的是spring boot+spring-data-elasticsearch
wozuishuai 回复了问题 • 4 人关注 • 3 个回复 • 2846 次浏览 • 2018-06-15 10:07
es报错Unexpected exception in the selector loop
回复ccsy 发起了问题 • 2 人关注 • 0 个回复 • 6701 次浏览 • 2018-06-11 15:54