【面试亮点】线上GC问题排查止损解决 (heap space OutOfMemory排查止损解决)

【面试亮点】线上GC问题排查&止损&解决(heap space OOM排查&止损&解决)

许多同学总和我抱怨说面试的时候没有线上实际排查解决gc问题的经验,我这里分享我团队的一次比较好的从 发现问题->及时止损->排查问题->修复问题->复盘 全流程的实践经验,希望能帮到大家.

问题现象: CPU飙至99% 70%服务节点逐渐不可用

凌晨的时候,被电话叫醒,一看指标: CPU.busy 好家伙很多机器节点cpu使用率直接飙高到99.97%,而且raptor(理解为监控大盘工具)大量的失败请求,大概有70%的节点直接不可用!差点给我吓尿了.PM的电话,上下游的电话,各种拉群拉会的.肾上腺素顿时飙高

有问题 , 先止损, 再修复

大家在面对线上问题的时候,第一要务是迅速止损,尽可能降低资损,先保证没有增量问题的时候,再去排查解决存量问题. 不是所有节点不可用,意味着是代码导致机器出了问题,而不是mysql这样的共享资源,因为如果mysql不可用应该是所有节点的请求都会失败. 于是我们迅速查看了服务代码的发布情况,果然在前一天该服务进行了代码上线,因为之前该服务没有过这样的问题,经过短暂的排查后迅速读出结论应该是这次代码发布导致的线上问题,于是迅速执行下述止损流程:

1.禁用问题节点,防止请求打到问题节点上
2.扩容机器,注意扩容时用的包用老的包
3.禁用所有存量的,非扩容节点
4.回滚所有非扩容节点包
至此不再有增量问题,开始排查存量问题,该修数据修数据,该改bug改bug

问题排查

我们这个服务并 不是计算密集型的服务,怎么会有cpu.busy(占用率超过90%) 呢?有经验的老码农可能已经意识到了,这种情况大概率是内存在做垃圾回收,大量的垃圾回收算法会消耗大量的cpu资源.于是我们去查了一下大盘中JVM相关的一些监控,果然发现了大量的FULL GC,而且每次FULL GC的持续时间有5~6S.并且产生了"heap space OutOfMemory"报错,根据时间线推断是因为多次full gc后,仍然无法从堆内存中申请到够用的空间,从而导致堆内存溢出,节点彻底不可用.. 仔细梳理报错,发现居然还伴随着long-SQL,根据监控大盘的报错,是有batch Insert的时候向数据库插入的记录过多,导致了long-SQL.
于是我们重新CR了上线的代码,很快锁定了问题.导致这次问题的罪魁祸首居然是线程池.这次同学上线的代码大题逻辑是如下:

1.查询数据库,获取一些数据
2.根据数据库数据和请求数据做某种业务逻辑运算
3.把运算结果插入数据库表中
很常见的操作,但该同学考虑到性能问题,于是采用了线程池操作
根据业务逻辑给处理的数据分组,对于每组数据开启一个线程去处理
至此该同学的设计还是合理的
但遗漏了一个至关重要的点!
!!!!!
batch insert插入的数据不能过多,否则会导致long-sql!所以有batch insert要提前评估数据量啊!!!
!!!!!

吐了,于是导致多次full gc再到后来heap space OOM的场景就可以复现了

1.从内从中读取了大量的数据,存储到内存堆区域
2.没有评估到batchInsert的数据量(多的有数千行),发生long-sql,时间有5s~6s
3.大量的long-sql任务导致很多任务持续时间长,从而导致线程池队列中任务数迅速增加
4.大量线程任务没执行完,GCRoot不会回收他们栈中索引指向的堆区域
5.当堆剩余空间不足以支持新的线程任务的申请内存空间时,发生full gc
6.多次full gc之后剩余空间仍然不够用 发生heap space OutOfMemory 堆内存溢出
7.节点不可用!

修复问题

找到了问题发生的原因,解决的方法也呼之欲出了.
不过这里说一点,解决这种问题不要总想着去优化JVM分区的一些占比和大小.
这些东西有经验的程序员都知道主要是装逼用的,如果实际的线上问题若非必要不建议改JVM参数,为了解决一个问题去修改JVM参数导致个别机器和公司统一容器配置不同可能会引发更多的问题,弊大于利,而且真要遇到那种问题你连排查都没法排查只能找基建同学,而在大厂跨部门的事情扯皮沟通拉会太多了,等问题解决了,基本服务已经不可用很久了.所以实际解决还是从代码层面来

短期方案:
1.对batch Insert插入的数据做分组,多次批量插入,解决long-sql,避免线程池任务大量积压在队列中
2.扩容,增加50%的节点数(一般扩大heap space的手段不是直接改大机器配置而是多加几台机器)长期方案:
1.重构这一块代码
2.首先看能否和PM沟通,修改交互手段,避免一个线程一次处理如此多的数据
3.重新设计,合理评估线程池参数和batch insert的性能
4.完善监控告警
5.QA沟通在测试的时候重点测试性能这一块

复盘

又到了最恶心的COE复盘环节了,各种文档写不停,这里我们在wiki里只列一下最重要的问题

1.为什么没有相应的监控指标告警?导致没有在问题出现前提前发现问题并止损?
long-sql的指标是有的,只不过是warn级别的告警,因为是老服务历史包袱比较重,long-sql较多,于是本次服务的long-sql在开发测试时候都不太明显.2.没有灰度吗?为什么直到出现这么大问题的时候才发现问题并回滚?
有灰度,灰度期间没有该问题,这种情况是因为在流量高峰请求参数过大导致的,后续会拉长灰度周期,多观察后再全量.3.方案设计的时候为什么没有预估到这种情况?
这种大参数场景极少,就出现过这一次,超出预期了.4.类似的问题以后怎么避免?解决的流程能否沉淀成SOP?
1.QA沟通开启上线前long-sql扫描工具,每次上线前checklist强制流程必须过一下long-sql
2.每次使用线程池必须评估下是否会有这种线程池任务积压,每个任务指向一个大对象导致heap OOM场景

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

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

相关文章

DOS命令第二篇

雷迪斯and the乡亲们 欢迎你们来到 奇幻的编程世界 一、echo命令 作用: 输出一个内容到终端 格式: echo 要输出的内容 案例: 直接输出一个“你好” 二、ping 概念: 在网络中通信的时候,主机之间进行通信依靠…

转行或者跳槽入职一家新公司,应该如何快速上手工作?

不管是干测试也好或者其它任何职业,没有谁会在一家公司待一辈子,转行不一定,但是跳槽是每一个打工人早晚都会面临的事情,今天就来跟大家聊聊这件事~ 入职一家新公司,你应该做什么可以最快速的上手工作? 这…

App Inventor 2 如何预览PDF文档?

预览PDF文档的方式 你可以使用Activity启动器查看已存储在你的设备上的 pdf 文档,也可以使用Web客户端通过网址URL打开 pdf 文档。 App Inventor 2 可以使用 .pdf 扩展名从程序包资产中查看 pdf 文件,不再需要外部 pdf 查看器! 代码如下&a…

车载摄像头畸变校正解决方案,打造无畸变高清视界

在车载摄像头日益普及的今天,摄像头图像的畸变问题成为了制约图像质量提升的一大瓶颈。畸变不仅影响画面的美观度,更关键的是它可能导致智能驾驶系统对环境的误判,进而威胁到行车安全。美摄科技凭借其在图像处理领域的深厚实力,推…

redis清理缓存接口开发

文章目录 1 用户注册1.1 简要描述1.2 请求URL1.3 请求方式1.4 参数1.5 返回示例1.6 返回参数说明1.7 备注 2 用户登录2.1 简要描述2.2 请求URL2.3 请求方式2.4 参数2.5 返回示例2.6 返回参数说明2.7 备注 3 权限校验3.1 简要描述3.2 请求URL3.3 请求方式3.4 参数3.5 返回示例3.…

leetcode刷题(python)——(一)

01.01.04 练习题目(第 01 天) 1. 2235. 两整数相加 1.1 题目大意 描述:给定两个整数 n u m 1 num1 num1 和 n u m 2 num2 num2。 要求:返回这两个整数的和。 说明: − 100 ≤ n u m 1 , n u m 2 ≤ 100 -100 \l…

中东跨境电商平台Noon注册开店步骤详解

中东地区,素以“满地富豪”闻名,同时拥有发达的电子商务环境与较高的居民消费水平,吸引了大量跨境电商从业者前来寻求商机。其中,Noon作为中东地区颇具人气的电商平台,自然而然成为了众多卖家开拓中东市场的首选平台。…

普通类的成员函数模板

4-4普通类的成员函数模板、类模板的成员函数模板、&#xff08;c11&#xff09;模板显式实例化&#xff0c;模板声明_普通类的模板函数能否为虚函数-CSDN博客 实例&#xff1a; #include <QApplication> #include <QDebug> struct user_inform {QString user_name;…

牛客 接头密匙

Problem: 牛客 接头密匙 文章目录 思路解题方法复杂度Code 思路 这个问题可以通过使用前缀树&#xff08;Trie&#xff09;来解决。前缀树是一种用于存储字符串的数据结构&#xff0c;其中每个节点代表一个字符串的前缀。在这个问题中&#xff0c;我们可以使用前缀树来存储数组…

Flex布局(秒懂弹性盒子的使用)

目录 一、Flex介绍 1.概念 主要概念&#xff1a; 2.Flex容器属性 3.Flex项目属性 4.优势 二、Flex使用 1.弹性盒子内容 2.flex-direction 语法 3.justify-content 属性 4.align-items 属性 语法 5.flex-wrap 属性 语法&#xff1a; 6.align-content 属性 语法&am…

在 Google Colab 中安装torch-xla 报错

关于深度学习的一些学习框架,我使用过pytorch,caffe,caffe2,openchatkit,oneflow等,最近我将长达几十万字的报错手册重新进行了整理,制作出一个新的专栏,主要记录这几种常见的开发框架在安装和使用过程中常见的报错,以及我是如何解决掉的,以此来帮助更多的深度学习开…

jetson系列开发板使用虚拟机烧录系统时,遇见无法识别开发板的情况

在双系统中的ubuntu系统烧录没问题&#xff0c;但是电脑Ubuntu系统由于版本低&#xff0c;所以没有网络&#xff0c;烧录起来还的连网线&#xff0c;所以问了开发板的工程师&#xff0c;所幸&#xff0c;解决了问题&#xff0c;很感谢工程师的指导&#xff0c;特此记录一下&…

【研发日记】CANoe自动化测试的配置方式(三)——SystemVariables数组方式

文章目录 前言 一、例程功能 二、仿真ECU 三、SystemVariables数组&#xff1a; 四、测试模块 五、测试运行效果 六、分析和应用 总结 前言 近期在做的一个自动化测试项目&#xff0c;尝试了一种以前没用过的测试配置方式&#xff0c;感觉效果还不错。然后又回顾了一下以…

顺序表C语言实现

这是SL.h头文件 #pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h>typedef int SeqListType;typedef struct SeqList {SeqListType* arr;int next;int capacity; }SL; //调试使用void SLPrint(SL* ps);//初始化void SLInit(SL* ps);//…

JVM主要知识点详解

目录 1. 性能监控和调优 1.1 调优相关参数 1.2 内存泄漏排查 1.3 cpu飙⾼ 2. 内存与垃圾回收 2.1JVM的组成&#xff08;面试题&#xff09; 2.2 Java虚拟机栈的组成 2.3 本地方法栈 2.4 堆 2.5 方法区&#xff08;抽象概念&#xff09; 2.5.1 方法区和永久代以及元空…

阿里云服务器8核16G配置最新租用收费价格表与优惠价格

8核16G配置是大部分企业级用户购买阿里云服务器的首选配置&#xff0c;2024年经过调价之后&#xff0c;8核16G配置的阿里云服务器按量收费标准最低为0.9元/小时&#xff0c;按月租用平均优惠月价最低收费标准为432.0元/1个月&#xff0c;按年购买最低活动价格为1803.17元/1年&a…

Avalonia中嵌入网页程序(CefNet)

Avalonia中嵌入网页程序cefNet 1. 引入CefNetNuget包2. 下载 cef 基础环境3. 将cef基础环境放入程序运行目录下4. 代码中初始化cef5. 添加Webview控件6. 在窗口关闭的时候释放Cef7. 项目结构图CefNet 开源的作者已经停止维护并删除了原始的代码库:GetHub:CefNet,Nuget上还有发…

linux命令(一)

linux命令&#xff08;一&#xff09; 一、单选题 1、改变文件所有者的命令为()。 A、chmod B、touch C、chown D、cat 2、假设当前有两个用户组group1、group2,有三名用户usr1、usr2、usr3,其中usr1、usr2属于用户组group1,usr3属于用户组group2。假设用户usr1使用“touch f…

# ABAP SQL 字符串处理-CONCATCAST

经常我都要在ABAP的sql语句中对字符串进行处理&#xff0c;现在就总结一下可以用到的方法 文章目录 字符串处理拼接字段运行结果 填充字符串运行结果 截取字符串 SUBSTRING运行结果 CAST转换类型程序运行结果 CAST 转换成 DATS类型&#xff08;日期&#xff09; 字符串处理 在…

中国电子学会(CEIT)2021年12月真题C语言软件编程等级考试三级(含详细解析答案)

中国电子学会(CEIT)考评中心历届真题(含解析答案) C语言软件编程等级考试三级 2021年12月 编程题五道 总分:100分一、我家的门牌号(20分) 我家住在一条短胡同里,这条胡同的门牌号从1开始顺序编号。 若所有的门牌号之和减去我家门牌号的两倍,恰好等于n,求我家的…