当前位置: 首页 > news >正文

降低85%的gc发生率:ES的GC调优实践!

#大数据/ES #经验 #性能

问题背景

客户方面反馈的问题是ES入库速度变慢,延迟升高到几百毫秒,导致数据积压过多,影响了业务。

排查发现ES的服务日志出现不少的gc overhead现象,下面是一个示例的日志片段:

[yyyy-MM-ddTHH:mm:ss,SSS][LEVEL][component][node_name][gc][gc_id] overhead, 
spent [time_spent] collecting in the last [total_time], [additional_info] 
例如: [2023-06-15T14:30:00,000][WARN][o.e.m.j.JvmGcMonitorService][node-01][gc][1234] overhead, 
spent [2.5s] collecting in the last [3.0s], [heap used=70% of 10GB]

在这个例子中,日志表明在过去的3秒内,JVM用掉了2.5秒来进行垃圾回收,这可能是一个警告信号,表示GC活动过于频繁或者每次GC暂停时间过长,可能导致应用程序性能下降或响应迟钝。

如果这种情况持续,可能会触发“GC Overhead Limit Exceeded”错误,进而导致服务不稳定甚至崩溃。

解决方案

排查思路:

  • 查看日志,查看并分析Elasticsearch日志中的GC详细信息,包括GC类型
  • 询问业务的使用类型,业务的数据量,通过监控查看ES的搜索、写入的负载情况
  • 根据实际情况对JVM参数进行适当调整。

最终发现三个问题:

  1. 并发搜索居高不下,日常保持在1000个查询并发,但集群规模较小。
  2. 大的索引未拆分,且分片数过少,数据分布不均存在读写的热点。
  3. 磁盘性能不高,由于读写压力都比较大,磁盘使用率很高

由于业务侧代码不便更改,便采取优化服务端参数的办法,经过调优对比,我统计了调优前后各1天的日志内容,统计发现,gc发生率显著下降了85%,且结合索引的拆分操作,最终延迟下降了20倍,分享参数如下:

ES的G1GC参数(多实例适用)

-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:InitiatingHeapOccupancyPercent=40
-XX:+ParallelRefProcEnabled
-XX:+ExplicitGCInvokesConcurrent
-XX:ParallelGCThreads=8

注:该参数同样适用于HBase集群的参数调优,效果已经在实际环境中经过验证!

配置时的报错

切记!注意行尾不能带任何空格或者乱七八糟的换行符!

否则可能遇到如下启动失败报错(行尾有空格,没注意到):

Unrecognized VM option 'UseG1GC  '
Did you mean '(+/-)UseG1GC'?

参数介绍:

  • -XX:+UseG1GC:启用G1垃圾收集器。
  • -XX:MaxGCPauseMillis=200:设置最大GC暂停时间为200毫秒。这个值可以根据实际情况进行调整,以实现更好的系统性能。
  • -XX:InitiatingHeapOccupancyPercent=35:当堆的使用率达到35%时,G1垃圾收集器将启动混合收集。这个值也可以根据实际情况进行调整。
  • -XX:+ParallelRefProcEnabled:启用并行引用处理。
  • -XX:+ExplicitGCInvokesConcurrent:显式GC调用并发处理。

思考

在Elasticsearch环境下,垃圾回收的效率直接影响着索引速度、查询延迟以及总体系统吞吐量。当GC工作过于频繁或执行时间过长时,就会出现“gc overhead”警报,这意味着GC活动占用了大量CPU资源,使得应用程序的实际处理能力下降,严重时甚至会导致响应时间延长、服务不可用等问题。因此,正确配置JVM的GC参数是Elasticsearch性能调优的关键步骤之一。

那么,有广泛适用的推荐配置值吗?

由于具体的应用场景和需求差异较大,很难给出适用于所有情况的推荐配置值。建议根据应用的具体需求和性能测试结果来调整上述参数。例如,可以先使用默认配置进行性能测试,然后根据性能测试结果逐步调整-Xmx-XX:MaxGCPauseMillis-XX:InitiatingHeapOccupancyPercent等关键参数,以达到最佳的性能表现。

G1GC的配置是一个复杂的过程,需要综合考虑应用的需求、硬件资源、性能目标等多个因素。在实际操作中,建议结合官方文档、性能测试结果和社区经验来进行配置和优化。

相关文章:

  • App Inventor 2 Personal Image Classifier (PIC) 拓展:自行训练AI图像识别模型,开发图像识别分类App
  • Openwrt(IstoreOS)安装iventoy
  • Hive Thrift Server
  • 小程序Taro框架 自定义底部Tabbar,处理自定义Tab栏切换卡顿、闪烁
  • 华为配置智能升级功能升级设备示例
  • 【C++ Primer Plus学习记录】break和continue语句
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • 通过vue ui创建项目
  • IntelliJ IDEA 下载安装及配置使用教程
  • C#中的线程以及[STAThread]、COM(Component Object Model)
  • 985硕的4家大厂实习与校招经历专题分享(part1)
  • ChatGPT提问技巧——控制温度和TOP-P样本
  • 2024年 Python面试热点
  • Python实现选择排序算法
  • Java方法重载
  • CentOS从零开始部署Nodejs项目
  • JavaScript标准库系列——Math对象和Date对象(二)
  • JavaScript新鲜事·第5期
  • js写一个简单的选项卡
  • Spring-boot 启动时碰到的错误
  • supervisor 永不挂掉的进程 安装以及使用
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • vue自定义指令实现v-tap插件
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 王永庆:技术创新改变教育未来
  • 用 Swift 编写面向协议的视图
  • 用jquery写贪吃蛇
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 选择阿里云数据库HBase版十大理由
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ![CDATA[ ]] 是什么东东
  • #控制台大学课堂点名问题_课堂随机点名
  • (02)vite环境变量配置
  • (31)对象的克隆
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • .a文件和.so文件
  • .NET gRPC 和RESTful简单对比
  • .NET/C# 在 64 位进程中读取 32 位进程重定向后的注册表
  • .net分布式压力测试工具(Beetle.DT)
  • /proc/vmstat 详解
  • @TableLogic注解说明,以及对增删改查的影响
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)
  • [.net]官方水晶报表的使用以演示下载
  • [1181]linux两台服务器之间传输文件和文件夹
  • [BZOJ3223]文艺平衡树
  • [C++] Boost智能指针——boost::scoped_ptr(使用及原理分析)
  • [CTO札记]盛大文学公司名称对联
  • [C语言]——函数递归