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 count
、number of replicas
、refresh_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 主题订阅者堆内存泄漏 - 为啥消息在增加?
设置环境变量后 Elasticsearch 报告默认堆内存大小