记一次CPU飙升问题排查


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

场景

1.正常的jvm监控曲线图

在这里插入图片描述

2.产生问题的jvm监控曲线图

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

分析

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

1. 进入pod之后,输入top查看各linux进程对系统资源的使用情况(因为这是事后补稿,资源使用不高,大家看步骤即可)

在这里插入图片描述

2. 分析资源使用情况在当时的情况下.

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

3. 输入top -H -p pid 通过此命令可以查看实际占用CPU最高的的线程的id,pid为刚才资源使用高的pid号

在这里插入图片描述

4. 出现具体线程的资源使用情况,表格里的pid代表线程的id,我们称他为tid

在这里插入图片描述

5. 我记得当时的tip为746(上述图片只是我给大家重复步骤),使用命令printf “%x\n” 746,将线程tid转换为16进制

在这里插入图片描述

6. 输入jstack pid | grep 2ea >gc.stack

在这里插入图片描述
jstack是jdk给提供的监控调优小工具之一,jstack会生成JVM当前时刻的线程快照,然后我们可以通过它查看某个Java进程内的线程堆栈信息,之后我们把堆栈信息通过管道收集2ea线程的信息,然后将信息生成为gc.stack文件

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

在这里插入图片描述
然后登录跳板机,使用curl下载curl -o http://ip地址/gcInfo.stack 为方便演示

8. 把文件下载到了本地,打开查看编辑器搜索2ea,找到nid为2ea的堆栈信息,

在这里插入图片描述
之后找到对应的impl根据行数分析程序

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

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

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值