1 new ArrayList不当导致CPU飙升-德赢Vwin官网 网
0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

new ArrayList不当导致CPU飙升

jf_ro2CN3Fa 来源:芋道源码 2023-08-15 14:56 次阅读

天线上容器突然cpu飙升,也是第一次排查这种问题所以记录一下~

前言

首先问题是这样的,周五正在写文档,突然收到了线上报警,发现cpu占用达到了90多,上平台监控系统查看容器,在jvm监控中发现有一个pod在两个小时内产生了61次youngGc一次fullGc,这个问题特别严重且少见,由于我之前也没有排查过此类问题,所以也是百度,但整个过程也有一些自己的思考,所以跟大家分享一下~

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

当时场景

我先给大家看一下一副正常的gc曲线监控(为保密性,我自己按照平台监控画了出来):

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

正常的jvm监控曲线图

586b3368-3b2f-11ee-9e74-dac502259ad0.jpg正常的jvm监控曲线图

产生问题的jvm监控曲线图

5887183a-3b2f-11ee-9e74-dac502259ad0.jpg产生问题的jvm监控曲线图

可以看的出来,正常情况下该系统很少gc(具体看业务系统使用情况、jvm内存分配),但是在图二中出现了大量异常的gc情况甚至触发了fullGc,所以我当时立马进行了分析。

具体分析

首先异常gc的情况只出现在一个pod上(系统有多个pod),在监控系统找到对应的pod,进入pod内部查看问题原因,排查问题一定要冷静

  1. 进入pod之后,输入top查看各linux进程对系统资源的使用情况(因我这是事后补稿,资源使用不高,大家看步骤即可)
58a4cdf8-3b2f-11ee-9e74-dac502259ad0.jpg
  1. 分析资源使用情况在当时的情况下
58ab49da-3b2f-11ee-9e74-dac502259ad0.jpgtop

当时我的pid为1的进程cpu上到了130(多核)那我认定就是java应用出问题了,control+c退出继续往下走

  1. 输入top -H -p pid 通过此命令可以查看实际占用CPU最高的的线程的id,pid为刚才资源使用高的pid号
58b9e2c4-3b2f-11ee-9e74-dac502259ad0.jpgtop -H -p pid
  1. 出现具体线程的资源使用情况,表格里的pid代表线程的id,我们称他为tid
58ce3a30-3b2f-11ee-9e74-dac502259ad0.jpgtid
  1. 我记得当时的tip为746(上述图片只是我给大家重复步骤),使用命令printf "%x " 746,将线程tid转换为16进制
58e9a892-3b2f-11ee-9e74-dac502259ad0.jpgtid转换为16进制

因为我们线程id号在堆栈里是16进制的所以需要做一个进制转换

  1. 输入jstack pid | grep 2ea >gc.stack
jstackpid|grep2ea>gc.stack
59038000-3b2f-11ee-9e74-dac502259ad0.jpgjstack

解释一下,jstack是jdk给提供的监控调优小工具之一,jstack会生成JVM当前时刻的线程快照,然后我们可以通过它查看某个Java进程内的线程堆栈信息,之后我们把堆栈信息通过管道收集2ea线程的信息,然后将信息生成为gc.stack文件,我随便起的,随意

  1. 当时我先cat gc.stack 发现数据有点多在容器里看不方便,于是我下载到本地浏览,因为公司对各个机器的访问做了限制,我只能用跳板机先找到一台没用的机器a,把文件下载到a然后我再把a里的文件下载到本地(本地访问跳板机OK),先输入python -m SimpleHTTPServer 8080,linux自带python,这个是开启一个简单http服务供外界访问
590a29e6-3b2f-11ee-9e74-dac502259ad0.jpg开启http服务

然后登录跳板机,使用curl下载curl -o http://ip地址/gcInfo.stack

为方便演示,我在图中把ip换了一个假的

59108016-3b2f-11ee-9e74-dac502259ad0.jpgcurl

之后用同样的方法从本地下载跳板机就可以了,记得关闭python开启的建议服务嗷

  1. 把文件下载到了本地,打开查看编辑器搜索2ea,找到nid为2ea的堆栈信息
59223130-3b2f-11ee-9e74-dac502259ad0.jpg找到nid为2ea的堆栈信息

之后找到对应的impl根据行数分析程序

  1. 发现是在文件异步导出excel的时候,导出接口使用了公共列表查询接口,列表接口查询数据最多为分页200一批,而导出数据量每个人的权限几万到十几万不等
593f284e-3b2f-11ee-9e74-dac502259ad0.jpg导出excel

并且该判断方法使用了嵌套循环里判断,且结合业务很容易 get 不到 value,Java 下的new ArrayList 就是返回一个 List 集合(好像不用说这么细 (;一_一 ),在整个方法结束之前,产生的 lists生命周期还在所以发生多次gc触发重启之后还影响到了别的pod。然后对代码进行了fix,紧急上线,问题解决~

结束语

遇到生产问题,大家不要害怕,遇到问题先保证服务是否可用,然后通过有限的信息层层解析,找出最终的问题。如果你会 arthas,排查起来会更轻松!


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10854

    浏览量

    211574
  • 编辑器
    +关注

    关注

    1

    文章

    805

    浏览量

    31163
  • 进程
    +关注

    关注

    0

    文章

    203

    浏览量

    13960

原文标题:new ArrayList 不当导致 CPU 飙升。。

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    OpenHarmony语言基础类库【@ohos.util.ArrayList (线性容器ArrayList)】

    ArrayList是一种线性数据结构,底层基于数组实现。ArrayList会根据实际需要动态调整容量,每次扩容增加50%。
    的头像 发表于 04-25 18:48 618次阅读
    OpenHarmony语言基础类库【@ohos.util.<b class='flag-5'>ArrayList</b> (线性容器<b class='flag-5'>ArrayList</b>)】

    用C语言实现ArrayList,动态增加数组及改变数组大小(可以打包存储,并恢复)

    移植到其他平台。简单的增加字符串例子:ArrayList *tmep = NULL;ArrayList *object = new_array_list(NULL,"
    发表于 02-28 12:33

    为什么f_mount后CPU使用率飙升10%?

    江湖救急:我用SD卡来导出运行过程中的一些数据,起了一个dump_output_task来负责dump,初始化时时f_mount了一把SD卡(返回值0),后面不做任何跟SD卡相关的读写操作,CPU使用率也直接飙升10%,求助。。。运行环境:UCOS-III
    发表于 10-27 23:34

    ArrayList的get/get如何操作?

    ArrayList的特点是什么ArrayList的get操作ArrayList的add操作
    发表于 11-09 06:43

    如何解决STM32串口溢出错误Overrun使用不当导致的串口死机?

    如何解决STM32串口溢出错误Overrun使用不当导致的串口死机?
    发表于 12-15 07:29

    FlexSPI复位方式不当导致i.MXRT系列下OTFAD加密启动失败怎么解决?

    FlexSPI复位方式不当导致i.MXRT系列下OTFAD加密启动失败怎么解决?
    发表于 02-07 08:11

    【学习打卡】OpenHarmony的ArrayList介绍

    在底层的集合允许我们在List 接口的帮助下插入和删除元素。List 接口是一个有序的对象集合,允许存储重复值。 ArrayList是OpenHarmony中实现List接口特性的类,具有结构
    发表于 07-27 21:51

    OpenHarmony应用示例:线性容器 ArrayList

    简介本示例通过线性容器 ArrayList 模拟了添加删除联系人的操作,展示了 ArrayList 相关的接口功能。效果图如下:相关概念线性容器ArrayListArrayList
    发表于 08-15 14:31

    PCB Layout不当引起CPU工作不稳定的解决方法

    在高速数字电路中,CPU的功耗往往随着主频的提升而增大,如果PCB Layout不当,则可能会引起CPU工作不稳定,本人就曾经遇到过。Marvell 88F6282 CPU运行在2GH
    发表于 06-01 09:15 2276次阅读

    螺杆支撑座安装不当导致哪些问题发生?

    螺杆支撑座是精密传动元件,在机械工业中起着很重要的作用,螺杆支撑座在使用过程中或多或少都会有需要注意的问题,如果这些问题处理不当,往往会导致机械运行中的一系列故障。
    的头像 发表于 03-04 17:41 573次阅读
    螺杆支撑座安装<b class='flag-5'>不当</b>会<b class='flag-5'>导致</b>哪些问题发生?

    JDK中java.util.ArrayList 类的介绍

    1、ArrayList 定义 ArrayList 是一个用数组实现的集合,支持随机访问,元素有序且可以重复。 public class ArrayList E > extends
    的头像 发表于 10-10 15:51 652次阅读
    JDK中java.util.<b class='flag-5'>ArrayList</b> 类的介绍

    ArrayList入门实践

    构造函数 ArrayList 有三个构造函数,默认不带参数的构造函数就是初始化一个空数组。 //一个空数组 private static final Object
    的头像 发表于 10-10 16:36 368次阅读
    <b class='flag-5'>ArrayList</b>入门实践

    cpu温度太高怎么解决?cpu温度高的原因?

    如何解决这一问题。 一、CPU温度过高的原因 1. 散热系统不当:服务器或台式机的散热系统设计可能不够完善,或者由于久经使用而积灰、质量下降等问题。CPU散热器可能被堵塞,导致热量无法
    的头像 发表于 12-09 16:15 3534次阅读

    鸿蒙语言基础类库:ohos.util.ArrayList 线性容器ArrayList

    ArrayList是一种线性数据结构,底层基于数组实现。ArrayList会根据实际需要动态调整容量,每次扩容增加50%。
    的头像 发表于 07-10 09:37 233次阅读
    鸿蒙语言基础类库:ohos.util.<b class='flag-5'>ArrayList</b> 线性容器<b class='flag-5'>ArrayList</b>

    主板cpu故障灯常亮是什么原因

    2.1 硬件问题 CPU安装不当 :如果CPU没有正确安装,或者安装时损坏了针脚,可能会导致故障灯亮起。 过热问题 :CPU过热可能
    的头像 发表于 09-02 14:43 4550次阅读