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 诊断工具

点赞收藏加关注

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

相关推荐
饮啦冰美式12 分钟前
22.04Ubuntu---ROS2使用rclcpp编写节点
linux·运维·ubuntu
wowocpp12 分钟前
ubuntu 22.04 server 安装 和 初始化 LTS
linux·运维·ubuntu
Huaqiwill14 分钟前
Ubuntun搭建并行计算环境
linux·云计算
wclass-zhengge16 分钟前
Netty篇(入门编程)
java·linux·服务器
Lign1731418 分钟前
ubuntu unrar解压 中文文件名异常问题解决
linux·运维·ubuntu
vip4511 小时前
Linux 经典面试八股文
linux
大霞上仙1 小时前
Ubuntu系统电脑没有WiFi适配器
linux·运维·电脑
AAA 建材批发王哥(天道酬勤)2 小时前
JVM 由多个模块组成,每个模块负责特定的功能
jvm
孤客网络科技工作室2 小时前
VMware 虚拟机使用教程及 Kali Linux 安装指南
linux·虚拟机·kali linux