【面试亮点】线上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…

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

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

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

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

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

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

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

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

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

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

JVM主要知识点详解

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

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

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

Avalonia中嵌入网页程序(CefNet)

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

# ABAP SQL 字符串处理-CONCATCAST

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

【c语言】结构体的访问

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:C语言 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步&…

webIDE jupyternotebook中添加虚拟环境

困扰了我好久啊啊啊终于可以了,好了步入正题: 首先参考这个博客 指路 但是有一些错误,就是我添加我的虚拟环境时显示权限不够 我就在这一步前面加上了sudo python -m ipykernel install --nameyour_env_name(虚拟环境名)但是又显示 sudo: p…

DIY可视化实现仿抖音短视频代码生成器

DIY可视化实现仿抖音短视频代码生成器,仿抖音短视频兼容uniapp、微信小程序 丝滑切换视频效果,无限数据加载不卡顿,高性能滑动不卡顿超流畅,观看视频丝滑切换,页面内容自定义,无限数据加载不卡顿。 在线设…

简单3步,OpenHarmony上跑起ArkUI分布式小游戏

标准系统新增支持了方舟开发框架(ArkUI)、分布式组网和 FA 跨设备迁移能力等新特性,因此我们结合了这三种特性使用 ets 开发了一款如下动图所示传炸弹应用。 打开应用在通过邀请用户进行设备认证后,用户须根据提示完成相应操作&am…

入局新能源车赛道 深象智能智慧门店方案落地极氪全国门店

继商超、商场、校园场景后,银泰商业集团旗下科技公司深象智能科技入局新能源汽车赛道。4月16日,深象智能科技与极氪智能科技达成战略合作。该公司研发的软硬件一体化“智慧门店”解决方案,将应用于极氪全国门店。 (图:…

如何将Oracle 中的部分不兼容对象迁移到 OceanBase

本文总结分析了 Oracle 迁移至 OceanBase 时,在出现三种不兼容对象的情况时的处理策略以及迁移前的预检方式,通过提前发现并处理这些问题,可以有效规避迁移过程中的报错风险。 作者:余振兴,爱可生 DBA 团队成员&#x…

WEB前端-笔记

目录 一、字体 二、背景图片 三、显示方式 四、类型转换 五、相对定位 六、绝对定位 七、固定定位 八、Index 九、粘性定位 十、内边距 十一、外边距 十二、边框 十三、盒子尺寸计算问题 十四、清楚默认样式 十五、内容溢出 十六、外边距的尺寸与坍塌 十七、行…

支持国密加密卡的堡垒机是什么牌子?电话多少?

堡垒机作为一种关键的安全设备,其对于国密加密卡的支持显得尤为重要。目前市面上堡垒机品牌众多,那么究竟哪个品牌的堡垒机支持国密加密卡呢?电话多少呢? 支持国密加密卡的堡垒机是什么牌子?电话多少? 【回…