【问题标题】:Cluster stuck on high heap usage集群卡在高堆使用率上
【发布时间】:2016-08-27 07:56:33
【问题描述】:

我有 Elasticsearch v 2.2.0 集群、1 个节点、4g 堆大小、7g RAM、2 个 cpu 核心、401 个索引、1,873 个分片、107,780,287 个文档,总数据 70.19GB

我还配置了 indices.fielddata.cache.size: 40%

问题是当我使用 Kibana 查询某些东西(非常简单的查询)时,如果它是单个查询,它工作正常,但如果我继续查询更多 - 弹性变得如此缓慢并最终卡住,因为JVM 堆使用率(来自 Marvel)达到 87-95%。当我尝试加载一些 Kibana 仪表板时也会发生这种情况,这种情况的唯一解决方案是重新启动弹性服务或 clear all cache

为什么堆会这样卡住?

编辑:

_node/stats when heap is stuck

_node/stats when cluster in normal state

编辑 2:

为了更好地理解问题,我分析了内存转储。此分析是在集群尝试一些 Kibana 查询后执行的:

问题嫌疑人 1:

问题嫌疑人 2:

问题嫌疑人 3:

在某些索引中,我确实有 _ttl 的设置不起作用(_ttl 设置为 4 周,但文档仍然存在......)。从那以后,我更改了默认映射,但没有删除“不工作的 ttl”索引。

这可能是主要问题吗?

【问题讨论】:

  • 你能简要分享一下GET /_nodes/stats的结果吗?

标签: elasticsearch


【解决方案1】:

我认为您现在别无选择,只能向集群添加更多节点、增加当前节点的硬件资源或不在集群中存储那么多索引

对于这么小的节点,您有很多分片,所有这些分片都使用一些内存 (767MB) 来处理通常的事情:术语、规范和段元数据使用的总体内存:

    "segments": {
      "count": 14228,
      "memory_in_bytes": 804235553,
      "terms_memory_in_bytes": 747176621,
      "stored_fields_memory_in_bytes": 31606496,
      "term_vectors_memory_in_bytes": 0,
      "norms_memory_in_bytes": 694880,
      "doc_values_memory_in_bytes": 24757556,
      "index_writer_memory_in_bytes": 0,
      "index_writer_max_memory_in_bytes": 1381097464,
      "version_map_memory_in_bytes": 39362,
      "fixed_bit_set_memory_in_bytes": 0
    }

您已迁移到 ES 2.x,这意味着您现在默认使用 doc_values,并且 fielddata 的使用量确实非常小(11.8MB):

    "fielddata": {
      "memory_size_in_bytes": 12301920,
      "evictions": 0
    }

旧的过滤器缓存(现在称为查询缓存)也非常小:

    "query_cache": {
      "memory_size_in_bytes": 302888,

清除缓存(字段数据、查询缓存)我不太确定它是否有很大的不同。在收集统计数据时,堆使用量为 2.88GB (72%),这并不高(在 75% 时,JVM 触发了旧 GC)。但是,对我来说,对于这么多分片来说,这个节点太小了。

还有一点需要注意,与内存问题无关:

    "open_file_descriptors": 29461,
    "max_file_descriptors": 65535,

有这么多打开的文件描述符,我强烈建议increase the OS limit for the count of open file descriptors

【讨论】:

  • 但是为什么 indices.fielddata.cache.size: 40% 不处理堆资源呢?
  • 另外,我不明白为什么要增加打开文件描述符计数的操作系统限制?在您提供的链接中没有任何解释...
  • 另外,我不明白当集群卡住时是什么在消耗整个堆?估计不是fielddata,我看到查询缓存是0,那么瓶颈是什么?
  • Fielddata 通过迁移到 ES 2.x 得到“照顾”,默认情况下使用 doc_values 而不是 fielddata。有一些字段还在使用fielddata,但是你集群的fielddata好像没问题。关于文件描述符,如果系统用完它们(并且隐含 ES),那么 ES 将无法再运行。您的索引基本上由磁盘上的文件组成(很多)。而 ES 使用文件描述符来打开这些文件并访问它们。
  • 关于堆,ES 将其中的一部分用于自己的事情,加载类、缓冲区、计算聚合、进行排序等。顺便说一句,4GB 堆不是一个大值。查看实际堆的最佳方法是进行堆转储 (jmap -dump:format=b,file=heap.hprof <PID>) 并使用 Yourkit 或 Eclipse MAT 之类的工具来查看转储。但对我来说,考虑到内存使用量为 4GB 堆,使用率为 72%段,并不少见。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
  • 2013-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多