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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/78920.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++之类和对象:构造函数,析构函数,拷贝构造,赋值运算符重载

前提:如果一个类是空类,C中空类中真的什么都没有吗,不是的,编译器会自动生成6个默认成员函数。默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数。 默认成员函数:构造函…

【专题五】位运算(1):常见位运算操作总结

📝前言说明: 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,按专题划分每题主要记录:(1)本人解法 本人屎山代码;(2)优质解法 优质代码;&#xff…

小草GrassRouter多卡聚合路由器聚合卫星、MESH网络应用解决方案

一、多网融合解决方案 卫星网络融合‌ 支持接入卫星通信模块,在无地面网络覆盖的极端场景(如偏远山区、海洋救援)下,形成“5G卫星”双链路冗余传输,卫星链路可作为核心通信备份,确保关键指令和视频数据实…

【Mybatis】Mybatis基础

文章目录 前言一、搭建MyBatis1.1 创建maven工程1.2 加入log4j日志功能1.3 MyBatis的增删改查1.4 核心配置文件详解 二、MyBatis获取参数值的两种方式2.1 单个字面量类型的参数2.2 多个字面量类型的参数2.3 map集合类型的参数2.4 实体类类型的参数2.5 使用Param标识参数 三、 M…

AI四大边界

大模型训练的边界并非由单一因素决定,而是技术、伦理、法律及实际应用需求共同作用的结果。以下从四个维度解析其边界来源: 一、技术边界:资源与能力的双重限制 计算资源瓶颈 成本与算力:大模型训练依赖海量GPU/TPU资源&#xff…

Twitter 工作原理|架构解析|社交APP逻辑

这是对Twitter 工作原理|架构解析|社交APP逻辑_哔哩哔哩_bilibili的学习,感谢up小凡生一 在两年半前,埃隆马斯克收购了Twitter,并且进行了一系列重大改革。今天我们来解析一下这个全球知名社交平台的架构。首先&#x…

Java基础学习内容大纲

Java基础学习内容大纲 第一阶段:建立编程思想 ​ Java概述:如何快速学习Java技术、Java历史、Java特点、Sublime、Java运行机制、JDK、转义字符、Java开发规范、Java API ​ 变量:数据类型、变量基本使用、数据类型转换 ​ 运算符:运算符介绍、算数运算符、关系运算符、…

如何对多维样本进行KS检验

对于形状为 ( 10000 , 1 , 304 ) (10000, 1, 304) (10000,1,304)的三维数据,若需使用scipy.stats.ks_2samp进行KS检验,可按以下步骤处理: 数据降维 KS检验要求输入为一维数组,需将三维数据展平或按特定维度聚合: • 方…

在 VMware 虚拟机中安装 Windows7

文章目录 前言1.安装VMware 虚拟机1. VMware虚拟机软件安装2. 虚拟机创建配置(超详细步骤)3. Windows7系统安装 3、安装 VMware tools4. VMware Tools安装与优化5. 总结与常见问题 前言 最近有不少朋友在问如何在电脑上同时使用多个操作系统&#xff0c…

直播预告|TinyVue 组件库高级用法:定制你的企业级UI体系

TinyVue 是一个跨端跨框架的企业级 UI 组件库,基于 renderless 无渲染组件设计架构,实现了一套代码同时支持 Vue2 和 Vue3,支持 PC 和移动端,包含 100 多个功能丰富的精美组件,可帮助开发者高效开发 Web 应用。 4 月 …

分治而不割裂—分治协同式敏捷工作模式

分治而不割裂:解密敏捷协同工作模式如何驱动大企业持续领跑 在数字化浪潮中,亚马逊仅用11天完成Prime Day全球技术架构升级,华为5G基站项目组创造过单周迭代47个功能模块的纪录,这些商业奇迹的背后,都隐藏着一个共性秘…

Python列表全面解析:从基础到高阶操作

一、为什么需要列表? 在Python中,列表是可变有序序列,用于存储多个元素的容器。相较于单一变量存储独立值,列表能更高效地管理批量数据,其特点包括: ​引用存储:列表元素存储的是对象的引用​…

Spring知识点梳理

一、Spring(Spring Framework) 1、IOC(控制反转) 1)什么是IOC控制反转? 为了解藕,有反转就有“正转”,“正转”就是程序员手动 new对象;“反转”就是将对象的创建、对…

SpringBoot启动后自动执行方法的各种方式-笔记

1. SpringBoot启动后自动执行方法的各种方式 1.1 PostConstruct 注解 作用:在依赖注入完成后执行初始化方法。 适用场景:需要在Bean初始化时执行某些操作(如配置、预加载数据)。 注意:该方法在Bean初始化阶段执行&…

基础知识-java流steam

Java Stream 流详解 一、Stream 概述 #mermaid-svg-ZXmu5UZgAcGGq8EN {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ZXmu5UZgAcGGq8EN .error-icon{fill:#552222;}#mermaid-svg-ZXmu5UZgAcGGq8EN .error-text{fil…

8.Android(通过Manifest配置文件传递数据(meta-data))

配置文件 <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"><applicationandroid:allowBackup"tr…

java 解析入参里的cron表达式,修改周时间

文章目录 前言一、java 解析入参里的cron表达式,修改周时间二、使用步骤1.示例 总结 前言 一、java 解析入参里的cron表达式,修改周时间 示例&#xff1a; 第一种: 0 0 0,16 ? * 0,1 第2种 0 0 0,16 ? * 1-7 第3种 0 0 0,16 ? * ? 第4种 0 0 0,16 ? * * 二、使用步骤 1…

DTO,VO,PO,Entity

1. DTO (Data Transfer Object) 定义 DTO 是数据传输对象&#xff0c;用于在不同系统或层之间传输数据。 目的 简化数据传输&#xff0c;降低耦合&#xff0c;通常只包含需要传输的字段&#xff0c;避免暴露内部实现细节。 使用场景 Controller 和 Service 或 远程调用 之…

从零搭建高可用分布式限流组件:设计模式与Redis令牌桶实践

一、需求背景与设计目标 在分布式系统中&#xff0c;面对突发流量时需要一种精准可控的流量控制手段。我们的组件需要具备&#xff1a; 多维度限流&#xff08;用户/IP/服务节点/自定义表达式&#xff09;分布式环境下精准控制开箱即用的Spring Boot Starter集成高扩展性的架…

Node.js 事件循环和线程池任务完整指南​

在 Node.js 的运行体系中&#xff0c;事件循环和线程池是保障其高效异步处理能力的核心组件。事件循环负责调度各类异步任务的执行顺序&#xff0c;而线程池则承担着处理 CPU 密集型及部分特定 I/O 任务的工作。接下来&#xff0c;我们将结合图示&#xff0c;详细剖析两者的工作…