副本 利用阿里开源工具进行排查线上CPU居高问题

图片

创建Controller:TestWhile图片

配置文件application.properties

server.port=80
server.servlet.context-path=/api

打包项目,上传测试服务器

java -jar demo-0.0.1-SNAPSHOT.jar &

打开浏览器,访问死循环方法

打开浏览器,地址栏输入http://xxxx/api/user/testWhile?size=2
返回“Hello 程序执行完毕”,说明调用成功。(开启了2个死循环)

到此问题代码,已经在服务器上面跑了。我们发现服务器报警,于是去线上排查。

原生方法

此方法无需额外安装工具,在没法连接互联网的情况下使用此方法排查效果较好。

top、printf都是Linux原生命令,jstack、jstat是jdk自带命令工具

很多功能强大的Linux和java诊断工具也是以top、jstack、jstat为基础命令做的封装

注意:jstack、jstat等命令需要jdk完整安装,linux自带的openJdk一般无此工具,可以在java的bin目录下查看是否有这些命令。

找到最耗CPU的进程

命令:top –c,显示进程运行信息列表

实例:top -c。

交互1:按1,数字1,显示多核CPU信息。
交互2:键入P (大写p),进程按照CPU使用率排序

图片

图片

我们看出了双核CPU使用率已经达到100%。

而第一个进程PID是373的就是我们要找的罪魁祸首了;可以看到进程最后一列,COMMAND注释的进程名:“java -jar demo-0.0.1-SNAPSHOT.jar”。

找到最耗CPU的线程

命令:top -H -p 【PID】,显示一个进程的线程运行信息列表

实例:top -Hp 373 ,如下图所示,可以看到多个高耗CPU使用率的线程

图片

转换线程PID为16进制

命令:printf “%x\n” 【线程pid】,转换多个线程数字为十六进制,第4步使用时前面加0x。

实例:printf ‘%x\n’ 406 405 375 376,得到结果196、195、177、178;如下图所示:

图片

查看堆栈,定位线程

命令:jstack 【进程PID】| grep 【线程转换后十六进制】-A10 , 使用jstack获取进程PID堆栈,利用grep定位线程id,打印后续10行信息。

实例:jstack 373 | grep ‘0x196’ -A10,如下图所示:图片

我们通过查看堆栈信息,发现了问题是TestWhile.whileTrue引起的

而且发现有2个GC线程,看上图中的“GC task thread#0 (ParallelGC)”,代表垃圾回收线程,该线程会负责进行垃圾回收

存储堆栈,批量查看

查看堆栈信息,我们也可以换个方法查看,可以先将jstack堆栈信息存储起来。

命令:jstack 【进程PID】> 【文件】

实例:jstack 373 > demo.dump,存储373进程的堆栈信息。

再使用cat + grep查找看看后面几个高CPU线程的堆栈信息。

实例:cat -n demo.dump | grep -A10 ‘0x196’,如下图所示:图片

可以看到线程0x196【线程196】产生堆栈信息,直指方法whileTrue。

GC查看

我们看到上图中有4个线程中的2个线程没有看到java代码,而是GC task thread#0 (ParallelGC),这个是GC垃圾回收的线程,是不是死循环导致了GC太频繁,导致CPU使用率居高不下呢?

我们使用jstat看下jvm的GC信息看看。

命令:jstat -gcutil 【进程PID】【毫秒】【打印次数】

实例:jstat -gcutil 373 2000 5,查看373进程的GC信息,每2秒打印一次,共打印5次,如下图所示:图片

S0:幸存1区当前使用比例
S1:幸存2区当前使用比例
E:伊甸园区使用比例
O:老年代使用比例
M:元数据区使用比例
CCS:压缩使用比例
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间

上面的原生方法查找要遵循一定的步骤,相对有些麻烦点,有没有比较简单的方法呢?往下看

Arthas(阿尔萨斯)

Arthas(阿尔萨斯)是阿里巴巴开源出来的一个针对 java 的线上诊断工具,功能非常强大。Arthas 支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。我们来看看

下载Arthas

使用arthas-boot(推荐)

下载arthas-boot.jar,然后用java -jar的方式启动:

curl -O https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar

图片

按1进入java进程,此时java进程PID已经变成373

进入阿尔萨斯完成,如下图,可以看到登录路径已经变成了[arthas@17376]$,可以输入dashboard,进入监控页面了。

监控查看

已经进入Arthas操作界面,输入dashboard,回车后将看到线程及堆栈信息,如图所示,arthas已经将cpu高使用率的线程给安排上了。

图片

上面我们就看到有2个线程居高不下,还有GC的数量和耗时。

thread【ID】查看线程

ctrl + c 退出dashboard界面,输入thread 32查看线程信息,如下图所示:图片

可以看到是TestWhile类中的whileTrue方法中的put方法导致cpu使用率升高。

问题一下子就出来了,Arthas功能不单单止于此,可以直接反编译,看看代码。

jad反编译

使用Arthas自带的反编译方法jad,输入命令:

** jad com.rainbow.demo.service.TestWhile**

可以反编译java的class查看问题函数的具体代码,如下图所示:图片

退出arthas

最后,既然问题已经找到,那就退出Arthas吧。输入命令:quit

Arthas的功能是非常强大的,这里就简单介绍,下一次老顾用专门的文章介绍

老顾在介绍一个更简单的一个脚本,立刻发现问题所在

show-busy-java-threads

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

在此为大家准备了四节优质的Android高级进阶视频:

架构师项目实战——全球首批Android开发者对Android架构的见解

附相关架构及资料

image.png

往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。**

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
  • 11
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值