我有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 仪表板时也会发生这种情况,这种情况的唯一解决方案是重新启动弹性服务或清除所有缓存。
为什么堆会这样卡住?
编辑:
编辑2:
为了更好地理解这个问题,我分析了内存转储。这个分析是在集群尝试一些 Kibana 查询之后执行的:
在某些索引中,我确实有 _ttl 的设置不起作用(_ttl 设置为 4 周,但文档仍在那里......)。从那以后,我更改了默认映射,但没有删除“不工作 ttl”索引。
这可能是主要问题吗?
我认为您现在没有其他选择,只能向集群添加更多节点、增加当前节点的硬件资源或者不在集群中存储那么多索引。
对于如此小的节点,您有很多分片,所有这些分片都使用一些内存(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)
由于打开的文件描述符如此之多,我强烈建议增加操作系统对打开文件描述符计数的限制。
| 归档时间: |
|
| 查看次数: |
3094 次 |
| 最近记录: |