排查思路 当正在运行的Java服务导致服务器的CPU突然飙高时,我们该如何排查定位到哪个接口的哪行代码导致CPU飙高的问题呢?我主要提供两个方案: jstackarthas 准备工作 代码准备 现在需要准备一段可以让服务器CPU飙高的代码以
当正在运行的Java服务导致服务器的CPU突然飙高时,我们该如何排查定位到哪个接口的哪行代码导致CPU飙高的问题呢?我主要提供两个方案:
现在需要准备一段可以让服务器CPU飙高的代码以及把代码部署到服务环境。
@RestController@RequestMapping("/test")public class TestController { @GetMapping("top") public void test() { while (true) { } }}
#整流程mvn cleanmvn compilemvn package
在idea中为:
java -jar demo1-0.0.1-SNAPSHOT.jar > demo.log &
jstack 是 jdk 提供的一个命令行工具,用于生成 Java 进程的线程转储信息(也称为线程快照)。它可以帮助诊断和调试 Java 应用程序的线程相关问题,如死锁、线程等待、线程占用CPU过高等。
jstack 命令可以在运行中的 Java 进程上执行,它会输出当前 Java 进程中所有线程的堆栈跟踪信息。这些信息包括每个线程的方法调用栈、锁信息、线程状态等。
以下是 jstack 的一些常见用途和作用:
- 线程分析:jstack 生成的线程转储信息可以显示 Java 进程中所有线程的堆栈跟踪信息。您可以查看每个线程的调用栈,了解线程执行的代码路径和方法调用关系。
- 死锁检测:通过查看线程的锁信息,jstack 可以帮助您发现是否存在死锁情况。它会显示每个线程当前持有的锁和等待的锁,以及导致死锁的锁依赖关系。
- 线程等待:jstack 可以显示线程的等待状态,帮助您确定是否存在线程等待某个资源的情况。这对于排查程序在运行时出现的卡死或长时间无响应问题非常有用。
- CPU 使用分析:通过查看线程的 CPU 使用情况,jstack 可以帮助您确定哪些线程消耗了大量的 CPU 资源,找出可能导致 CPU 占用过高的原因。
- 线程状态监控:jstack 提供了对线程状态的监控,您可以了解线程的状态,如运行、阻塞、等待等,以便更好地理解应用程序的运行情况。
top命令用于监视 linux 系统的实时进程和系统性能信息。那么我们可以通过top命令来实时定位到那个线程占用大量CPU资源。
输入命令:
top
可以看到PID列中进程id为8066的进程CPU占用率达到了98.7%,那么我们接下来排查的就是这个进程。
top -H -p PID
该命令的作用是在 top 工具中显示指定进程ID(PID)的线程级别信息。它将以线程级别的模式显示指定进程的各个线程的详细信息。
具体解释如下:
以上已定位具体线程pid导致CPU飙高,那么将指定pid转换为16进制,以便下一步定位具体线程问题使用。
将一个十进制的进程ID(PID)转换为十六进制格式的字符串,可以使用 printf 命令来实现。printf 命令可以根据指定的格式将数据进行格式化输出。
printf '0x%x\n' pid
jstack pid | grep hexadecimal -A N
具体解释如下:
那么可以很快定位到是TestController类第20行出现了问题。
那么我们看代码:
Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、GC、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar --repo-mirror aliyun --use-Http
运行时arthas会提示用户选择哪个Jar服务,那么我们选择【1】,按1即可。
开始监控。
thread -n 1
使用arthas可以更快定位问题代码行。
更多使用技巧请参考官方文档:
来源地址:https://blog.csdn.net/weixin_42313773/article/details/132396601
--结束END--
本文标题: 服务器CPU飚高排查
本文链接: https://www.lsjlt.com/news/388986.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-06-11
2024-06-11
2024-06-11
2024-06-11
2024-06-11
2024-06-11
2024-06-11
2024-06-11
2024-06-11
2024-06-11
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0