elasticsearch - Elastic Search 的 Java 堆空间问题

标签 elasticsearch jvm heap-memory

发生了什么:
当我反复查询时,Elastic Search 突然停止工作。
我将堆大小从 1GB 增加到 2GB,然后又增加到 4GB,但没有用。
当前堆使用率仅为分配的 4Gb 的 20%,但为什么 ES 仍因 OOM 而失败??

ElasticSearch 日志:

2019-11-11T11:12:16,654][INFO ][o.e.c.r.a.AllocationService] [es-stg] Cluster health status changed from [RED] to [YELLOW] (reason: [shards started [[.kibana_1][0]] ...])
[2019-11-11T11:12:51,447][INFO ][o.e.c.m.MetaDataIndexTemplateService] [es-stg] adding template [kibana_index_template:.kibana] for index patterns [.kibana]
[2019-11-11T11:13:10,527][INFO ][o.e.m.j.JvmGcMonitorService] [es-stg] [gc][71] overhead, spent [418ms] collecting in the last [1s]
[2019-11-11T11:13:16,619][INFO ][o.e.m.j.JvmGcMonitorService] [es-stg] [gc][77] overhead, spent [313ms] collecting in the last [1s]
[2019-11-11T11:13:21,187][WARN ][o.e.m.j.JvmGcMonitorService] [es-stg] [gc][80] overhead, spent [2.4s] collecting in the last [2.5s]
[2019-11-11T11:13:25,396][WARN ][o.e.m.j.JvmGcMonitorService] [es-stg] [gc][83] overhead, spent [2s] collecting in the last [2.1s]
[2019-11-11T11:13:27,983][WARN ][o.e.m.j.JvmGcMonitorService] [es-stg] [gc][84] overhead, spent [2.3s] collecting in the last [2.6s]
[2019-11-11T11:13:30,029][WARN ][o.e.m.j.JvmGcMonitorService] [es-stg] [gc][85] overhead, spent [2s] collecting in the last [2s]
[2019-11-11T11:13:34,184][WARN ][o.e.m.j.JvmGcMonitorService] [es-stg] [gc][86] overhead, spent [4.1s] collecting in the last [4.1s]
[2019-11-11T11:14:31,155][WARN ][o.e.c.InternalClusterInfoService] [es-stg] Failed to update node information for ClusterInfoUpdateJob within 15s timeout
[2019-11-11T11:14:31,172][WARN ][o.e.m.j.JvmGcMonitorService] [es-stg] [gc][87] overhead, spent [18.2s] collecting in the last [18.3s]
[2019-11-11T11:14:31,215][ERROR][o.e.x.m.c.i.IndexStatsCollector] [es-stg] collector [index-stats] timed out when collecting data
[2019-11-11T11:14:31,210][ERROR][o.e.b.ElasticsearchUncaughtExceptionHandler] [es-stg] fatal error in thread [elasticsearch[es-stg][search][T#6]], exiting
java.lang.OutOfMemoryError: Java heap space

规范:
Ubuntu : 16.04
内存:8Gb
JVM内存:4Gb

结果:

http://localhost:9200/_cat/allocation
    84 4.6gb 55.1gb 22.2gb 77.3gb 71 206.189.140.50 206.189.140.50 es-stg
    42                                                          UNASSIGNED
http://localhost:9200/_cat/fielddata?v
        id                host ip node   field                        size
    o_KWnYBuR-aimAl1VUtygA ip ip es-stg shard.node                  2.7kb
    o_KWnYBuR-aimAl1VUtygA ip ip es-stg transaction.type             704b
    o_KWnYBuR-aimAl1VUtygA ip ip es-stg transaction.name.keyword      1kb
    o_KWnYBuR-aimAl1VUtygA ip ip es-stg kibana_stats.kibana.status    2kb
    o_KWnYBuR-aimAl1VUtygA ip ip es-stg beat.hostname               5.8kb
    o_KWnYBuR-aimAl1VUtygA ip ip es-stg transaction.result           704b
    o_KWnYBuR-aimAl1VUtygA ip ip es-stg kibana_stats.kibana.uuid      2kb
    o_KWnYBuR-aimAl1VUtygA ip ip es-stg source_node.name            2.7kb
    o_KWnYBuR-aimAl1VUtygA ip ip es-stg shard.index                12.1kb
    o_KWnYBuR-aimAl1VUtygA ip ip es-stg shard.state                 6.6kb
    o_KWnYBuR-aimAl1VUtygA ip ip es-stg context.service.agent.name  2.2kb
    o_KWnYBuR-aimAl1VUtygA ip ip es-stg source_node.uuid            2.7kb

http://localhost:9200/_cat/nodes?v
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
ip       18          98      2    0.04    0.08     0.06    mdi       *    es-stg

http://localhost:9200/_cluster/settings
{persistent: {xpack: {monitoring: {collection: {enabled: "true"}}}},transient: { }}

预期:
需要 Elasticsearch 才能正常工作。 (磁盘空间不足与此问题有什么关系?)

最佳答案

分配

一个好的经验法则是确保将每个节点的分片数量保持在其配置的每 GB 堆 20 到 25 个以下 示例:具有 30GB 堆的节点因此应具有最多 600-750 个分片 分片不应大于 50GB。 25GB 是我们的目标大分片。 保持分片大小小于数据节点大小的 40%。

分配公关。节点

curl localhost:9200/_cat/allocation?v

https://www.elastic.co/blog/how-many-shards-should-i-have-in-my-elasticsearch-cluster

将进程地址空间锁定到 RAM 中并避免交换

将此行添加到 config/elasticsearch.yml

bootstrap.memory_lock: true

https://www.elastic.co/guide/en/elasticsearch/reference/current/_memory_lock_check.html

关于elasticsearch - Elastic Search 的 Java 堆空间问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58800603/

相关文章:

java - 在常量池中看不到整数值

java - Eclipse 崩溃,获取堆异常 - 尝试部署 Android 应用程序时内存不足

ElasticSearch 按数组项过滤

ruby - 如何使用Chef在ruby中编写elasticsearch状态检查代码?

java - JPS工具如何获取正在执行的主类或jar的名称

java - 为什么调用 System.gc() 会导致内存使用量显着减少?

javascript - 通过引用替换 JS 对象 [重构工作代码]

c# - 类的字段,是存放在栈中还是堆中?

java - 通过 JAVA API 将映射放入 ElasticSearch

elasticsearch - ElasticSearch:在文档中查找相互匹配