集群卡在高堆使用率上

Res*_*hef 5 elasticsearch

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

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

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

为什么堆会这样卡住?

编辑:

_node/stats 当堆被卡住时

_node/stats 当集群处于正常状态时

编辑2:

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

在此处输入图片说明

问题嫌疑人1: 在此处输入图片说明

问题嫌疑人2: 在此处输入图片说明

问题嫌疑人3: 在此处输入图片说明

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

这可能是主要问题吗?

And*_*fan 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
    }
Run Code Online (Sandbox Code Playgroud)

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

    "fielddata": {
      "memory_size_in_bytes": 12301920,
      "evictions": 0
    }
Run Code Online (Sandbox Code Playgroud)

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

    "query_cache": {
      "memory_size_in_bytes": 302888,
Run Code Online (Sandbox Code Playgroud)

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

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

    "open_file_descriptors": 29461,
    "max_file_descriptors": 65535,
Run Code Online (Sandbox Code Playgroud)

由于打开的文件描述符如此之多,我强烈建议增加操作系统对打开文件描述符计数的限制