跳至内容

如何对 OpenSearch Service 集群上的 JVM 高内存压力问题进行故障排除?

2 分钟阅读
0

我的 Amazon OpenSearch Service 集群的 Java 虚拟机 (JVM) 内存压力很高,我想减少这种压力。

简短描述

默认情况下,OpenSearch Service 将 Amazon Elastic Compute Cloud (Amazon EC2) 实例 RAM 的 50% 用于高达 32 GiB 的 JVM 堆。JVM 内存压力指定了集群节点中 Java 堆的百分比。

以下场景可能会导致 JVM 高内存压力:

  • 对集群的请求数量激增
  • 查询中的聚合、通配符和宽时间范围
  • 节点间的分片分配不均衡或者集群中的分片过多
  • 字段数据或索引映射爆炸式增长
  • 无法管理入站负载的 Amazon EC2 实例类型

解决方法

监控数据中的模式

要解决 JVM 高内存压力问题,请减少集群流量。

运行以下命令以获取有关集群的节点级别统计信息,并识别遇到内存压力或垃圾回收过多的节点:

GET _nodes/stats/jvm

要进一步识别错误的请求,请启用慢速日志。有关详细信息,请参阅 OpenSearch 网站上的 Shard slow logs(分片慢速日志)。确保 JVM 内存压力低于 90%。有关慢速查询的详细信息,请参阅 Elasticsearch 网站上的 Advanced tuning: finding and fixing slow Elasticsearch queries(高级调整:查找并修复慢速 Elasticsearch 查询)

使用 Amazon CloudWatch 监控一段时间内的 JVM 内存使用量和垃圾回收行为。在遇到集群不稳定性之前,使用此信息来检测模式并执行操作。此外,配置 CloudWatch 警报以主动检测和解决 JVM 高内存压力。

检查您的缓存设置

要清除字段数据缓存,请运行以下查询:

POST /index_name/_cache/clear?fielddata=true

**注意:**清除缓存时,可能会中断正在进行的查询。

如果超出了 JVM 断路器限制,并且内存使用量未得到控制,则会收到 JVM OutOfMemoryError。要解决此问题,请根据您的配置要求修改父断路器字段数据缓存分配或请求断路器设置。有关如何修改这些集群级别设置的信息,请参阅 OpenSearch 网站上的 Cluster settings API(集群设置 API)

优化您的配置

请按照以下最佳实践来优化您的配置:

有关如何对 JVM 高内存压力进行故障排除的详细信息,请参阅为什么我的 OpenSearch Service 节点崩溃了?

了解 JVM 高内存压力的影响

以下场景显示了 OpenSearch Service 如何管理不同的 JVM 内存压力百分比:

  • 如果 JVM 内存压力达到 75%,则 Amazon OpenSearch Service 会启动 x86 实例类型的并发标记清除 (CMS) 垃圾回收器。基于 ARM 的 Graviton 实例类型使用垃圾优先 (G1) 垃圾回收器,该垃圾回收器使用额外的短暂停和堆碎片整理。
    **注意:**垃圾回收是一个 CPU 密集型流程。如果内存使用量持续增长,那么您可能会遇到“ClusterBlockException”、“JVM OutOfMemoryError”或其他集群性能问题。
  • 如果 JVM 内存压力超过 92% 长达 30 分钟,则 OpenSearch Service 会阻止所有写入操作。
  • 如果 JVM 内存压力达到 100%,则 OpenSearch 服务将退出并最终重启实例,并显示“OutOfMemory (OOM)”错误消息。

相关信息

对 OpenSearch Service 进行故障排除

Get started with OpenSearch Service: How many shards do I need?(开始使用 OpenSearch Service:我需要多少分片?)

AWS 官方已更新 6 个月前