Java线上cpu占用过高的排查方法
分析:
cpu占用过高的可能原因:
频繁 gc
死循环、线程阻塞、io wait…等等
解决方案(一共三种):
方法1:
1.执行命令 top ,查看所有进程占系统CPU的排序,定位进程的PID – 进程号:
2.执行命令top -Hp PID,PID为刚才拿到的PID进程号, 定位使用 CPU 最高的线程:
3.执行命令:printf “%x\n” PID ,将线程 PID 转化为 16 进制为tid:
> printf '0x%x' 12817
> 0x3211
4.执行命令 jstack PID | grep tid 找到线程堆栈,打印前后30行:
> jstack 12816 | grep 0x3211 -A 30
即可定位到 CpuReaper.java 这个类的第25行可能存在问题!
方法2:
命令 show-busy-java-threads的使用
这个脚本来自于github上一个开源项目,项目提供了很多有用的脚本,show-busy-java-threads就是其中的一个。使用这个脚本,可以直接简化方法1中的繁琐步骤,直接打印出问题所在。如下,
linux上直接按顺序执行以下命令:
第一步:
> wget --no-check-certificate https://raw.github.com/oldratlee/useful-scripts/release-2.x/bin/show-busy-java-threads
第二步:
> chmod +x show-busy-java-threads
第三步:
> ./show-busy-java-threads
结果:
show-busy-java-threads说明:
1.从所有运行的Java进程中找出最消耗CPU的线程(缺省5个),打印出其线程栈
2.缺省会自动从所有的Java进程中找出最消耗CPU的线程,这样用更方便
3.当然你可以手动指定要分析的Java进程Id,以保证只会显示你关心的那个Java进程的信息:
show-busy-java-threads -p <指定的Java进程Id>
show-busy-java-threads -c <要显示的线程栈数>
方法3:
arthas thread的使用
阿里开源的 arthas 现在已经几乎包揽了我们线上排查问题的工作,提供了一个很完整的工具集。在这个场景中,也只需要一个thread -n命令即可。
第一步:下载arthas
> curl -O https://arthas.gitee.io/arthas-boot.jar
下载完成后,当前路径就会有新增这个jar文件:
第二步:启动
>java -jar arthas-boot.jar
说明:看到success字眼,证明启动成功;
第三步:执行arthas 命令:
>thread -n 5
要注意的是,arthas的cpu占比,和前面两种cpu占比统计方式不同。前面两种针对的是Java进程启动开始到现在的cpu占比情况,arthas这种是一段采样间隔内,当前JVM里各个线程所占用的cpu时间占总cpu时间的百分比。
具体见官网:https://alibaba.github.io/arthas/thread.html
。
。
。
。
。
。
。
参考自:http://hccm.rongsoft.com/article/2020/09/291429471141/