昨天线上容器突然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 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
正常的jvm监控曲线图
![586b3368-3b2f-11ee-9e74-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/A1/1E/wKgaomToRQyAUpzhAAB77RONP3o586.jpg)
产生问题的jvm监控曲线图
![5887183a-3b2f-11ee-9e74-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/A1/1E/wKgaomToRQyANz2jAACnUyyadyk384.jpg)
可以看的出来,正常情况下该系统很少gc(具体看业务系统使用情况、jvm内存分配),但是在图二中出现了大量异常的gc情况甚至触发了fullGc,所以我当时立马进行了分析。
具体分析
首先异常gc的情况只出现在一个pod上(系统有多个pod),在监控系统找到对应的pod,进入pod内部查看问题原因,排查问题一定要冷静
- 进入pod之后,输入top查看各linux进程对系统资源的使用情况(因我这是事后补稿,资源使用不高,大家看步骤即可)
![58a4cdf8-3b2f-11ee-9e74-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/A1/1E/wKgaomToRQyAGy3RAAAcVXyMFEY033.jpg)
- 分析资源使用情况在当时的情况下
![58ab49da-3b2f-11ee-9e74-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/A1/1E/wKgaomToRQyAIWF1AAD2dvqwVnI869.jpg)
当时我的pid为1的进程cpu上到了130(多核)那我认定就是java应用出问题了,control+c退出继续往下走
- 输入top -H -p pid 通过此命令可以查看实际占用CPU最高的的线程的id,pid为刚才资源使用高的pid号
![58b9e2c4-3b2f-11ee-9e74-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/A1/1E/wKgaomToRQyAa29zAAAbJMs2GLo851.jpg)
- 出现具体线程的资源使用情况,表格里的pid代表线程的id,我们称他为tid
![58ce3a30-3b2f-11ee-9e74-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/A1/1E/wKgaomToRQyAHE7dAACJP8wd9sA157.jpg)
- 我记得当时的tip为746(上述图片只是我给大家重复步骤),使用命令printf "%x " 746,将线程tid转换为16进制
![58e9a892-3b2f-11ee-9e74-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/A1/1E/wKgaomToRQ2Ab-FRAAA0Ft6SXEk892.jpg)
因为我们线程id号在堆栈里是16进制的所以需要做一个进制转换
- 输入jstack pid | grep 2ea >gc.stack
jstackpid|grep2ea>gc.stack
![59038000-3b2f-11ee-9e74-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/A1/1E/wKgaomToRQ2ALF6gAAAtMdcfOf4893.jpg)
解释一下,jstack是jdk给提供的监控调优小工具之一,jstack会生成JVM当前时刻的线程快照,然后我们可以通过它查看某个Java进程内的线程堆栈信息,之后我们把堆栈信息通过管道收集2ea线程的信息,然后将信息生成为gc.stack文件,我随便起的,随意
- 当时我先cat gc.stack 发现数据有点多在容器里看不方便,于是我下载到本地浏览,因为公司对各个机器的访问做了限制,我只能用跳板机先找到一台没用的机器a,把文件下载到a然后我再把a里的文件下载到本地(本地访问跳板机OK),先输入python -m SimpleHTTPServer 8080,linux自带python,这个是开启一个简单http服务供外界访问
![590a29e6-3b2f-11ee-9e74-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/A1/1E/wKgaomToRQ2AdWvLAAA_P-wZUHc886.jpg)
然后登录跳板机,使用curl下载curl -o http://ip地址/gcInfo.stack
为方便演示,我在图中把ip换了一个假的
![59108016-3b2f-11ee-9e74-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/A1/1E/wKgaomToRQ2Ae97jAAAy4xPdlZw672.jpg)
之后用同样的方法从本地下载跳板机就可以了,记得关闭python开启的建议服务嗷
- 把文件下载到了本地,打开查看编辑器搜索2ea,找到nid为2ea的堆栈信息
![59223130-3b2f-11ee-9e74-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/A1/1E/wKgaomToRQ2AHXHwAAC-fzfFuf4749.jpg)
之后找到对应的impl根据行数分析程序
- 发现是在文件异步导出excel的时候,导出接口使用了公共列表查询接口,列表接口查询数据最多为分页200一批,而导出数据量每个人的权限几万到十几万不等
![593f284e-3b2f-11ee-9e74-dac502259ad0.jpg](https://file1.elecfans.com//web2/M00/A1/1E/wKgaomToRQ2AOU_cAAA29LpZZmE497.jpg)
并且该判断方法使用了嵌套循环里判断,且结合业务很容易 get 不到 value,Java 下的new ArrayList 就是返回一个 List 集合(好像不用说这么细 (;一_一 ),在整个方法结束之前,产生的 lists生命周期还在所以发生多次gc触发重启之后还影响到了别的pod。然后对代码进行了fix,紧急上线,问题解决~
结束语
遇到生产问题,大家不要害怕,遇到问题先保证服务是否可用,然后通过有限的信息层层解析,找出最终的问题。如果你会 arthas,排查起来会更轻松!
-
cpu
+关注
关注
68文章
10922浏览量
213280 -
编辑器
+关注
关注
1文章
807浏览量
31331 -
进程
+关注
关注
0文章
204浏览量
14010
原文标题:new ArrayList 不当导致 CPU 飙升。。
文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
OpenHarmony语言基础类库【@ohos.util.ArrayList (线性容器ArrayList)】
![OpenHarmony语言基础类库【@ohos.util.<b class='flag-5'>ArrayList</b> (线性容器<b class='flag-5'>ArrayList</b>)】](https://file1.elecfans.com/web2/M00/C5/CD/wKgZomYCdwyAIFf5AAB_7E1pFms943.jpg)
用C语言实现ArrayList,动态增加数组及改变数组大小(可以打包存储,并恢复)
为什么f_mount后CPU使用率飙升10%?
【学习打卡】OpenHarmony的ArrayList介绍
OpenHarmony应用示例:线性容器 ArrayList
PCB Layout不当引起CPU工作不稳定的解决方法
螺杆支撑座安装不当会导致哪些问题发生?
![螺杆支撑座安装<b class='flag-5'>不当</b>会<b class='flag-5'>导致</b>哪些问题发生?](https://file.elecfans.com/web2/M00/96/06/pYYBAGQDEjqAQpmnAAC6CWWzwm0130.png)
JDK中java.util.ArrayList 类的介绍
![JDK中java.util.<b class='flag-5'>ArrayList</b> 类的介绍](https://file1.elecfans.com/web2/M00/A7/91/wKgaomUlAmaAESSsAADGG4TZENI116.jpg)
cpu温度太高怎么解决?cpu温度高的原因?
鸿蒙语言基础类库:ohos.util.ArrayList 线性容器ArrayList
![鸿蒙语言基础类库:ohos.util.<b class='flag-5'>ArrayList</b> 线性容器<b class='flag-5'>ArrayList</b>](https://file1.elecfans.com//web2/M00/FA/66/wKgZomaNNh6AMUdvAAACSiKnE8w332.jpg)
评论