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. 分析线程状态:

    • 查看线程状态(例如,RUNNABLE、TIMED_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 诊断工具

点赞收藏加关注

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

相关推荐
yeccheng1 分钟前
MySQL 索引超详解:从底层 B+ 树到面试高频考点
java·开发语言·jvm·mysql·面试
测试界的小码农3 小时前
【Linux 命令实战(03):文件创建、复制、移动与删除,掌握 touch、mkdir、cp、mv、rm】
linux·服务器·php
byte轻骑兵3 小时前
实战 1:修改 BlueZ 源码,添加自定义开机日志
linux·aiot·bluez·电脑蓝牙·嵌入式蓝牙
叼烟扛炮4 小时前
Linux 学习笔记(五十):网络层——IP 协议、子网划分与 NAT 魔法
linux·笔记·学习
叼烟扛炮4 小时前
Linux 学习笔记(六十):单线程的逆袭——epoll 高并发服务器实战
linux·服务器·网络·笔记·学习·算法
AR-26710-4 小时前
Linux Day32——实操五类资源告急排查
linux·运维
StarsGreen4 小时前
libva中的图像格式说明
linux
H.莓飛5 小时前
【C++】【STL】vector_OJ题
linux·服务器·开发语言·数据结构·c++·visual studio
Rabitebla5 小时前
【Linux操作系统】进程篇(十一):进程程序替换——从底层原理到 exec 函数族
linux·服务器·c++·笔记·学习·算法
无人生还别怕6 小时前
如何搭建docker仓库(轻量级)registry
linux·运维·docker·云原生·容器·registry·openanolisos