Elasticsearch 段建立,堆增加直到崩溃

Posted

技术标签:

【中文标题】Elasticsearch 段建立,堆增加直到崩溃【英文标题】:Elasticsearch segments builds up, heap increase until crash 【发布时间】:2018-06-06 06:30:55 【问题描述】:

我需要一些 ElasticSearch 帮助来解决困扰我几个月的问题,无论我做什么都没有任何真正的改善。

我运行一个 6 节点集群,由 6 个数据节点 r4.xlarge (30.5GB) 组成,其中 3 个也是合格的主节点。每个节点分配有 14GB 的 HEAP 内存。

问题如下: 堆锯齿图案是可见的,但随着时间的推移,它会变得越来越小,直至节点崩溃。 参见示例:

堆与段一起建立,您可以看到每晚创建新的每日索引时段计数的峰值。

我们的设置由 2 个主要索引和 2 个小索引组成,全部映射。 2个主索引有4个shard 1个replica,小的有1个shard 1个replica。

主要指数的每日指数大小不同:

展示次数指数 - 每天约 70-100GB,约 1500 万份文档 出价指数 - 每天 25-40GB,约 1300 万份文档 在两者上,refresh_interval 都设置为 5 秒。

索引率不是很高: 对于如此强大的集群,我什至会说它相当低。

显然存在一些配置问题,导致段无休止地建立起来并对堆内存使用造成压力。

我已经尝试过使用shards countnumber of replicasrefresh_interval 和更多...不行。 集群的这种设置甚至从 m4.xlarge 机器升级到了新的 r4.xlarge 机器——这也几乎没有任何效果!!

值得一提的是,我们每小时运行具有多个聚合级别的真正繁重的查询,最多可处理 7 天的数据(7 个索引),但有了如此多的 RAM 和正确的索引,这应该不是问题。

ElasticSearch 版本为 2.4.1,每个 r4.xlarge 节点由 30.5GB RAM 和 1200GB SSD 组成。当然,所有这些都托管在 AWS 上。

【问题讨论】:

在段数激增期间,您是否在日志中看到任何“正在限制索引”消息? 如果你还没有看一下这个:elastic.co/guide/en/elasticsearch/guide/current/… @ArchitSaxena 我在每个节点上都尝试了以下操作:grep -E 'throttle|throttling|indexing' /var/log/elasticsearch/*.log - 没有任何结果。 我已将 indices.store.throttle.max_bytes_per_sec 增加到 150mb。看最后一小时似乎没有任何区别.. 因此,它似乎与繁重的索引无关(您已经报告了大声笑)。但是你必须有很多索引,因为你每天都在创建新的索引。你对旧的怎么办?也许尝试在它们上运行一个明确的optimize,看看它如何影响段数? 【参考方案1】:

你是否在你的节点上设置了这个?

indices.fielddata.cache.size: 20%

根据设计,字段数据会在需要时加载到内存中,并且不会被驱逐。它们将填充堆,直到 OutOfMemory 异常。这不是错误,而是一项功能。

配置缓存限制以停止该“功能”至关重要。

我在 ElasticSearch 2.x 上有集群,但它们都遇到了这个问题。我不确定它是否在以后的版本中被调整为默认不系统地耗尽内存。

使用 stats API 查看资源使用情况:https://www.elastic.co/guide/en/elasticsearch/reference/2.4/cluster-nodes-stats.html

【讨论】:

以上是关于Elasticsearch 段建立,堆增加直到崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Activemq 主题订阅者堆内存泄漏 - 为啥消息在增加?

iOS 内存使用量增加直到崩溃

设置环境变量后 Elasticsearch 报告默认堆内存大小

在 Java 中为 weka 增加堆大小

elasticsearch对已存在的索引增加mapping字段

应用程序占用太多内存直到崩溃! (苹果手机)