CPU飙升 怎么定位问题

传统的方法

【top】

查看所有进程占系统CPU的排序,定位是哪个进程搞的鬼。PID那一列就是进程号。

【top -Hp pid】

定位进程中使用 CPU 最高的线程tid

【printf ‘0x%x’ tid】

线程 tid 转化 16 进制,例如printf ‘0x%x’ 11882    得到16进制的   0x2e6a

【jstack pid | grep tid 】找到线程堆栈,例如jstack  11763 | grep 0x2e6a -A 30

查问题时,会要多次上面的操作以分析确定问题,这个过程太繁琐太慢了
期望整合上面的过程成一个脚本,这样一行命令就可以自动化地搞定。

脚本方法

【wget --no-check-certificate https://gitee.com/fightx/useful-scripts/raw/dev-2.x/bin/show-busy-java-threads】

这条命令使用wget工具从gitee下载一个名为show-busy-java-threads的脚本文件。--no-check-certificate选项表示不检查SSL证书的有效性,这在某些情况下可能是必要的,但通常不推荐使用,因为它可能会导致安全风险。

【head -n 10 show-busy-java-threads】

检查下载下来的内容是否是脚本

【chmod +x show-busy-java-threads】

这条命令使用chmod工具赋予刚刚下载的show-busy-java-threads脚本可执行权限,使得它可以在命令行中直接运行。

【./show-busy-java-threads】

这条命令执行刚刚下载并赋予可执行权限的show-busy-java-threads脚本。这个脚本的作用是查找并显示系统中正在运行的Java进程中占用CPU资源最多的前5个线程。

分析步骤

  1. 识别高CPU消耗线程

    • 查看输出中每个线程的CPU占用百分比(例如,Busy(98.2%))。

    • 高CPU消耗的线程通常是性能瓶颈的潜在来源。

  2. 查看线程ID和名称

    • 每个线程都有一个线程ID(例如,29385)和名称(例如,"main")。

    • 这些信息有助于你识别具体的线程。

  3. 分析线程状态

    • 查看线程状态(例如,RUNNABLETIMED_WAITING)。

    • RUNNABLE状态表示线程正在运行或准备运行,而TIMED_WAITING状态表示线程在等待某个条件。

  4. 检查线程堆栈

    • 查看线程堆栈跟踪(例如,at com.example.MyClass.busyMethod(MyClass.java:42))。

    • 堆栈跟踪显示了线程当前执行的方法和代码行,有助于定位问题代码。

  5. 定位问题代码

    • 根据堆栈跟踪信息,找到具体的Java类和方法。

    • 检查这些方法的实现,看看是否有优化的空间或潜在的性能问题。

  6. 更多用法参照:docs/java.md · fightx/useful-scripts - Gitee.com

阿里开源方法

【curl -O https://arthas.aliyun.com/arthas-boot.jar】

 下载jar包

【java -jar arthas-boot.jar】

启用

在启动Arthas时,它会列出当前系统中正在运行的Java进程,并要求你选择一个进程进行监控。你需要输入进程的序列号(例如,输入1选择第一个进程),然后按回车键。

【thread -n 5】

进一步分析【thread id】

如果你发现某些线程的CPU使用率异常高,可以进一步分析这些线程的堆栈跟踪,以确定具体的性能瓶颈。例如,你可以使用以下命令来查看特定线程的堆栈跟踪:

其他命令参考官网:arthas: Arthas(阿尔萨斯)是阿里巴巴开源的 Java 诊断工具

点赞收藏加关注

下一期创作内容:通过上述步骤,找出有问题的代码之后,观察到线程栈之后。怎么根据具体问题来具体分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值