Elasticsearch 堆内存使用情况和 JVM 垃圾回收

作者:来自 Elastic Kofi Bartlett

探索 Elasticsearch 堆内存使用情况和 JVM 垃圾回收,包括最佳实践以及在堆内存使用过高或 JVM 性能不佳时的解决方法。

堆内存大小是分配给 Elasticsearch 节点中 Java 虚拟机的 RAM 数量。

从 7.11 版本开始,Elasticsearch 默认会根据节点的角色和总内存自动设置 JVM 堆内存大小。对于大多数生产环境,推荐使用默认配置。然而,如果你希望手动设置 JVM 堆内存大小,一般规则是将 -Xms 和 -Xmx 设置为相同的值该值应为系统总可用内存的 50%,但最大不应超过大约 31GB

较大的堆内存可以为节点提供更多用于索引和搜索操作的内存。但节点也需要内存用于缓存,因此使用 50% 可以在两者之间保持健康的平衡。出于同样的原因,在生产环境中应该避免在与 Elasticsearch 相同的节点上运行其他高内存占用的进程。

通常,堆使用率会呈锯齿状波动,在最大堆使用量的 30% 到 70% 之间。这是因为 JVM 会逐渐增加堆使用率,直到垃圾回收过程释放出内存。当垃圾回收过程无法跟上时,就会出现高堆使用率。一个高堆使用率的迹象是垃圾回收无法将堆使用率降低到大约 30%。

在上面的图像中,你可以看到 JVM 堆的正常锯齿状变化。

你还会看到有两种类型的垃圾回收:年轻代(young) GC 和老年代(old) GC

在健康的 JVM 中,垃圾回收理想情况下应满足以下条件:

  • 年轻代 GC 处理速度快(在 50 毫秒内完成)。
  • 年轻代 GC 执行频率不高(大约每 10 秒一次)。
  • 老年代 GC 处理速度快(在 1 秒内完成)。
  • 老年代 GC 执行频率不高(每 10 分钟或更久一次)。

当堆内存使用过高或 JVM 性能不佳时的解决方法

堆内存使用增加可能由多种原因引起:

分片过多( Oversharding )

请在这里参阅关于分片过多的文档。

聚合数据量过大( Large aggregation sizes )

为了避免聚合数据量过大,请在查询中尽量减少聚合桶( size )的数量。

复制代码
GET /_search
{
   "aggs" : {
       "products" : {
           "terms" : {
               "field" : "product",
               "size" : 5
                          }
       }
   }
}

你可以使用慢查询日志( slow logs ),并通过以下方式在特定索引上启用它:

复制代码
PUT /my_index/_settings
{
   "index.search.slowlog.threshold.query.warn": "10s",
   "index.search.slowlog.threshold.query.info": "5s",
   "index.search.slowlog.threshold.query.debug": "2s",
   "index.search.slowlog.threshold.query.trace": "500ms",
   "index.search.slowlog.threshold.fetch.warn": "1s",
   "index.search.slowlog.threshold.fetch.info": "800ms",
   "index.search.slowlog.threshold.fetch.debug": "500ms",
   "index.search.slowlog.threshold.fetch.trace": "200ms",
   "index.search.slowlog.level": "info"
}

执行时间长的查询很可能是资源密集型的操作。

批量索引请求过大( Excessive bulk index size )

如果你发送的是大型请求,这可能导致堆内存消耗过高。尝试减小批量索引请求的大小。

映射问题( Mapping issues )

特别是当你使用了 fielddata: true 时,这可能会大量占用 JVM 堆内存。

堆内存大小设置不当( Heap size incorrectly set )

你可以通过设置环境变量手动定义堆内存大小:

复制代码
ES_JAVA_OPTS="-Xms2g -Xmx2g"

在你的 Elasticsearch 配置目录中编辑 jvm.options 文件:

复制代码
-Xms2g
-Xmx2g

环境变量设置优先于文件设置。

需要重启节点才能使设置生效。

JVM 新代比例设置不当( JVM new ratio incorrectly set )

通常不需要手动设置这个值,因为 Elasticsearch 默认会设置此值。这个参数定义了 JVM 中 "新生代" 和 "老年代" 对象可用空间的比例。

如果你发现老年代 GC 变得非常频繁,可以尝试在 Elasticsearch 配置目录中的 jvm.options 文件中专门设置这个值。

复制代码
-XX:NewRatio=3

在大型 Elasticsearch 集群中管理堆内存使用和 JVM 垃圾回收的最佳实践是什么?

在大型 Elasticsearch 集群中管理堆内存使用和 JVM 垃圾回收的最佳实践是确保堆内存大小设置为可用内存的 50% 的最大值,并根据特定用例优化 JVM 垃圾回收设置。监控堆内存大小和垃圾回收指标以确保集群运行在最佳状态是非常重要的。具体来说,重要的是监控 JVM 堆内存大小、垃圾回收时间和垃圾回收暂停时间。此外,还需要监控垃圾回收周期的数量以及在垃圾回收中花费的时间。通过监控这些指标,可以识别堆内存或垃圾回收设置的潜在问题,并在必要时采取纠正措施。

想要获得 Elastic 认证吗?了解下一期 Elasticsearch 工程师培训的时间!

Elasticsearch 包含了许多新功能,帮助你为特定用例构建最佳的搜索解决方案。深入我们的示例笔记本,了解更多内容,开始免费云试用,或者立即在本地机器上尝试 Elastic。

原文:Elasticsearch heap size usage and JVM garbage collection - Elasticsearch Labs

相关推荐
星辰_mya5 分钟前
Elasticsearch更新了分词器之后
大数据·elasticsearch·搜索引擎
xiaobaibai1539 分钟前
决策引擎深度拆解:AdAgent 用 CoT+RL 实现营销自主化决策
大数据·人工智能
万岳科技系统开发14 分钟前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
悟纤25 分钟前
学习与专注音乐流派 (Study & Focus Music):AI 音乐创作终极指南 | Suno高级篇 | 第33篇
大数据·人工智能·深度学习·学习·suno·suno api
冉冰学姐27 分钟前
SSM智慧社区管理系统jby69(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·管理系统·智慧社区·ssm 框架
ESBK202528 分钟前
第四届移动互联网、云计算与信息安全国际会议(MICCIS 2026)二轮征稿启动,诚邀全球学者共赴学术盛宴
大数据·网络·物联网·网络安全·云计算·密码学·信息与通信
杨超越luckly34 分钟前
HTML应用指南:利用GET请求获取中国500强企业名单,揭秘企业增长、分化与转型的新常态
前端·数据库·html·可视化·中国500强
Elastic 中国社区官方博客42 分钟前
Elasticsearch:Workflows 介绍 - 9.3
大数据·数据库·人工智能·elasticsearch·ai·全文检索
B站_计算机毕业设计之家1 小时前
豆瓣电影推荐系统 | Python Django Echarts构建个性化影视推荐平台 大数据 毕业设计源码 (建议收藏)✅
大数据·python·机器学习·django·毕业设计·echarts·推荐算法
仍然.1 小时前
MYSQL--- 聚合查询,分组查询和联合查询
数据库