Elasticsearch GC优化实践

news2024/11/29 8:38:41

近期业务查询线上ES集群出现频繁超时告警,尤其是早晨某个时间点固定的报一波超时,从调用链监控上很难看出是什么业务行为导致的。

初步猜测

查看Grafana上Elasticsaerch的基础监控,发现业务告警与ES的Old GC(老年代GC)卡顿时间基本吻合:

 

同时注意到,Old区的内存持续增长,不到1小时就会将Old区填满,经过Old GC几乎全部可以回收掉:

猜测:

  • 是什么导致Old区快速增长?可能是内存分配速率过高导致过早晋升?可能是分配很大的对象?
  • 为什么Old GC这么慢?ES卡顿大概率与它有关,早晨时间固定发生可能与业务某种行为有关。

查看GC配置

所以先用JVM工具从外围查看一下GC配置与大概情况。

jmap查看ES堆情况:

  • MaxHeapSize:整个堆31GB。
  • MaxNewSize:Young区只有1GB。
  • OldSize:Old区有30GB。
  • NewRatio:取值2表示Young区应该占整个堆的1/3,应该是10GB才对,而实际才1GB,这非常奇怪。

我们期望的默认行为是Young=10GB,Old=20GB才对,为什么变成了1GB和30GB这样?

查看了一下JVM最终的启动参数,竟然真的自行推断Young区只占1GB空间,难道是JVM的BUG?

把剩余的GC参数谷歌了一下,果然发现有人测试过JDK8的-XX:+UseConcMarkSweepGC会导致NewRatio参数失效,原因不明!

这么小的Young区肯定会导致频繁Young GC (通过jstat -gc观察YGC每秒1~2次) ,对ES性能肯定没有好处, 虽然和Old GC慢没啥直接关系 ,但也必须先修复一下再说了,通过-Xmn直接指定Young区10GB即可:

重启ES观察到Young区大小正确,观察jstat -gc发现Young GC频率显著下降了6倍。

再次观察grafana,发现YGC频率的确下降(YGC之间有间隔了):

Old区仍旧保持高增速:

但是因为Young区从1GB调到10GB了,所以每次YGC对JVM heap的收缩振幅会更明显,图形上出现明显的起落,但整个JVM heap持续走高的势头没有改变,因为对象仍旧在快速晋升到Old区,直到Old区填满后一次Old GC再大幅回落。

开启GC日志

接下来要分析Old区快速增长的原因,另外要看一下为什么Old GC会卡顿1秒,能否优化?

配置开启GC日志,重启ES:

为了判断是不是存在很多”中生命期”的对象存在而导致频繁晋升到Old区,所以需要打开-XX:MaxTenuringThreshold=15参数,令Young区晋升条件提高为15代YGC,以便观察Young区的对象年龄分布。

一开始我采用默认参数是6代晋升,这是当时的截图:

图中观察到1~6岁的对象都有,每一代就几十MB的空间占用,我们知道YGC后6岁的就会进入Old区,1~5岁的就会都涨1岁,所以我怀疑就是每次YGC会导致第6代几十MB的”中生命期”对象晋升到Old区,大概算了一下这个速度的确和Old GC的周期接近,看样大概率是这个原因导致Old区增长的。

如果我调高晋升年龄到15代,有可能活到10岁的”中生命期”对象就会最终在YGC被回收掉,可能会减缓Old区的增长速度,抱着这个想法我才将XX:MaxTenuringThreshold调到了15,想给”中生命期”对象多一些机会被YGC回收掉。

但实际情况是15代都均匀的分布着对象,可见”中生命期”的对象活的比想象的要久,能熬过15代YGC还不释放,既然现实情况就是有很多”中生命期”对象存在,那减缓Old区增长的想法是比较难实现了, 索性继续研究一下为什么Old GC那么卡的问题吧 。

优化Old GC速度

根据打印到磁盘上gc日志,可以深入分析一下CMS Old GC的流程耗时在哪里,我们应该重点关注会导致STW(stop the world)的阶段耗时。

CMS垃圾回收算法是Old区的GC算法,它的开始以这样的日志标识:

2022-03-12T13:19:54.273+0800: 96253.129: [GC (CMS Initial Mark) [1 CMS-initial-mark: 23554181K(31398336K)] 23611096K(32395136K), 0.0063801 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]

初始化标记阶段,只会STW一丢丢的时间,基本可以忽略。

整个CMS的经历如下阶段:

在Remark阶段会有明显的STW,知乎上是这样描述的:

因为Old GC全流程比较漫长,期间Young区会快速填充,等到Remark阶段要扫全堆的时候Young区也填满了很多对象,此时强制配置一波YGC(本身又很快),应该可以减少Remark的STW耗时。

目前观察到Remark阶段耗时:

STW长达0.8秒,的确很惨,我们加上这个选项:

-XX:+CMSScavengeBeforeRemark

添加上述配置后,可以看到Remark阶段时间STW耗时缩短了7倍左右:

优化效果

红色为原线上配置的对照实例,其他机器均已生效新配置:

可见,GC频率与耗时均明显下降,新的Old GC耗时已经降低到原先的Young GC耗时的水平,早晨超时报警的情况也消失了。

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

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

相关文章

功率放大器的参数和应用场景是什么

功率放大器是电子测量行业比较常见的一种电子放大器,主要目的是增加给定输入信号的功率幅度,使输入信号功率增加,从而驱动到发射器等输出设备的负载水平。和电流放大器与电压放大器有所不同的是,功率放大器是直接驱动负载并且最终…

SessionCookie

会话 会话:用户打开浏览器进行的一系列操作直至关闭浏览器的过程看作是一次会话 HTTP协议是无状态的,不能实现跟踪对话。比如进入一个网站,每次操作的请求之间相互独立,无法相互联系。也就是说你每次请求过后得到的服务器响应或…

web前端-javascript-基本语法(注释,常用语法,代码格式)

文章目录基本语法1. JS 注释2. 常用语法3. 代码格式基本语法 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title><script type"text/javascript">/** 多行注释*///单行注释alert("hell…

学生学python编程---实现贪吃蛇小游戏+原码

学生学python编程---实现贪吃蛇小游戏原码前言主要设计1、蛇的表示2、蛇怎么移动&#xff1f;3、玩家控制小蛇移动功能的实现4、如何判定游戏结束&#xff1f;应用知识点1、python知识点1.1 列表append()在列表未尾增加一个元素del 删除最后一个元素在指定位置增加元素用insert…

vCenter命令行升级

1.为当前vCenter打快照 2.为vCenter关联新的iso镜像 3.SSH登录vCenter 4.检查ISO镜像 software-packages stage --iso software-packages list --staged 5.安装vCenter&#xff0c;安装预计40分钟 software-packages install --staged 6.重启vCenter Command>shell #re…

【论文】撰写小论文用到的资料

一、小论文算法的学习 &#xff08;一&#xff09;资料链接 1.联邦学习&#xff1a;https://www.baidu.com/s 2.迁移学习概述&#xff08;Transfer Learning&#xff09;https://blog.csdn.net/dakenz/article/details/85954548 3.迁移学习&#xff1a;经典算法解析&#xff…

前端怎么解决跨域

JSONP jsonp的原理就是利用<script>标签没有跨域限制&#xff0c;通过<script>标签src属性&#xff0c;将本地的全局函数通过callback传到服务器&#xff0c;服务端将接口返回数据拼凑到callback函数中&#xff0c;返回给客服端 实现思路 服务端的代码&#xff…

第七章 数学 AcWing 1533. 1 的个数

第七章 数学 AcWing 1533. 1 的个数 原题链接 AcWing 1533. 1 的个数 算法标签 数学 枚举 数位DP 思路 显然&#xff0c;直接暴力枚举时间复杂度 230(枚举N个数)∗10(枚举N个数每一位)≈10102^{30}(枚举N个数)*10(枚举N个数每一位)\approx10^{10}230(枚举N个数)∗10(枚举…

windows下通过远程桌面访问linux图形界面

一、安装epel库 epel库安装之前无法使用yum install xrdp命令安装xrdp 命令&#xff1a;yum install epel-release之后会自动匹配对应版本的rpm包&#xff0c;并解决依赖关系进行安装。 二、安装xrdp xrdp作为linux的图形化界面 1.命令&#xff1a;yum install xrdp2.开启…

【POJ No. 3368】 最频繁值 Frequent values

【POJ No. 3368】 最频繁值 Frequent values 北大OJ 题目地址 【题意】 给定n 个整数的非递减序列a 1 , a 2 ,…, an &#xff0c;对每个索引i 和j 组成的查询&#xff08;1≤i ≤j ≤n &#xff09;&#xff0c;都确定整数ai , …, aj 中的最频繁值&#xff08;出现次数最多…

Jmeter工具下载并直连MySQL数据库

优秀链接&#xff1a; Jmeter汉化 Jmeter初认识 前提有JDK&#xff0c;我的是1.8 下载Jmeter 下载的Jmeter版本是5.5无需配置Jmeter路径&#xff0c;下载后解压便可以运行 官网地址&#xff1a;https://jmeter.apache.org/download_jmeter.cgi 官网下载比较慢&#xff0c;在…

[附源码]计算机毕业设计JAVA健身健康规划系统

[附源码]计算机毕业设计JAVA健身健康规划系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

ADPCM(自适应差分脉冲编码调制)的原理和计算

关于ADPCM ADPCM(Adaptive Differential Pulse Code Modulation, 自适应差分脉冲编码调制) 是一种音频信号数字化编码技术, 音频压缩标准G.722, G.723, G.726 中都会使用到 ADPCM G.722 is an ITU-T standard 7 kHz wideband audio codec operating at 48, 56 and 64 kbit/s. …

【Linux】linux中,你不得不爱的命令集(下)

我们将要介绍的命令并不是linux中所有的命令&#xff0c;是我们常见的和经常要使用的命令。 我们所用的linux版本是centos7&#xff0c;我们的linux搭建是在腾讯云服务器上搭建的&#xff0c;借助Xshell登录服务器&#xff0c;在root下进行命令行的操作。 目录 mv指令&#x…

什么认证在云计算行业内的含金量最大?考试费用贵不贵?

作为一个新兴发展起来的技术&#xff0c;云计算在社会生产中的作用越来越重要&#xff0c;各家企业纷纷转型&#xff0c;希望能借用新技术&#xff0c;获得新的发展。这样一来市场就需要大量的新人才来维护运行&#xff0c;然而云计算作为新兴技术&#xff0c;还没有被大量引入…

野火FPGA入门(7):IP核调用

文章目录第24讲&#xff1a;快速开发的法宝&#xff1a;IP核第25讲&#xff1a;PLL-IP核的调用第26讲&#xff1a;ROM-IP核的调用rom_ctrl.vrom.v第27讲&#xff1a;RAM-IP核的调用key_filterram_crtlram第28讲&#xff1a;FIFO-IP核的调用同步FIFO异步FIFO第24讲&#xff1a;快…

Docker的四种网络模式和相关网络命令

一、Docker网络 1.实现原理 docker 使用linux 桥接&#xff0c;在宿主机虚拟一个docker 容器网桥&#xff08;docker0) &#xff0c;docker 启动一个容器时会根据docker 网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c;同时Docker 网桥是每个容器的…

建议别瞎卷,GitHub乱杀,MySQL DBA 攻坚指南一出,阿里数据库专家都解脱了

我先叭叭哈~ 大家可能并不觉得&#xff0c;数据库其实非常重要&#xff0c;每个业内巨头&#xff0c;每个成熟的互联网产品都有多个数据库系统&#xff0c;能保证大量并发场景下不出错&#xff0c;并非易事。尤其是银行、电商、电信、电力、航空等实时交易重要的环境中&#x…

微服务远程调用组件Feign的使用详解

一. 概要 我们知道&#xff0c;现在最火且最有技术含量的技术莫过于SpringCloud微服务了&#xff0c;所以今天百泽老师就带大家来学习一下微服务的核心的组件之一&#xff0c;Feign的基本使用及其工作机制。 二. Feign简介 1.概念 在学习Feign的使用之前&#xff0c;我们先…

贝赛尔曲线

<template><svg width"400" height"400" class"BG" mousemove"mousemove"><!-- 这样拼字符串&#xff0c;少些点加号&#xff0c;方便改一些 --><path class"Line":d"M${StartPoint[0]} ${StartP…