服务器CPU飚高排查

news/2024/10/22 4:46:25/

排查思路

当正在运行的Java服务导致服务器的CPU突然飙高时,我们该如何排查定位到哪个接口的哪行代码导致CPU飙高的问题呢?我主要提供两个方案:

  • jstack
  • arthas

准备工作

代码准备

现在需要准备一段可以让服务器CPU飙高的代码以及把代码部署到服务环境。

@RestController
@RequestMapping("/test")
public class TestController {@GetMapping("top")public void test() {while (true) {}}
}
打包

使用maven打包或者Docker服务将代码部署到服务器。

#整流程
mvn cleanmvn compilemvn package

在IDEA中为:

简单部署
java -jar demo1-0.0.1-SNAPSHOT.jar > demo.log &

jstack

jstack 是 JDK 提供的一个命令行工具,用于生成 Java 进程的线程转储信息(也称为线程快照)。它可以帮助诊断和调试 Java 应用程序的线程相关问题,如死锁、线程等待、线程占用CPU过高等。

jstack 命令可以在运行中的 Java 进程上执行,它会输出当前 Java 进程中所有线程的堆栈跟踪信息。这些信息包括每个线程的方法调用栈、锁信息、线程状态等。

以下是 jstack 的一些常见用途和作用:

  • 线程分析:jstack 生成的线程转储信息可以显示 Java 进程中所有线程的堆栈跟踪信息。您可以查看每个线程的调用栈,了解线程执行的代码路径和方法调用关系。
  • 死锁检测:通过查看线程的锁信息,jstack 可以帮助您发现是否存在死锁情况。它会显示每个线程当前持有的锁和等待的锁,以及导致死锁的锁依赖关系。
  • 线程等待:jstack 可以显示线程的等待状态,帮助您确定是否存在线程等待某个资源的情况。这对于排查程序在运行时出现的卡死或长时间无响应问题非常有用。
  • CPU 使用分析:通过查看线程的 CPU 使用情况,jstack 可以帮助您确定哪些线程消耗了大量的 CPU 资源,找出可能导致 CPU 占用过高的原因。
  • 线程状态监控:jstack 提供了对线程状态的监控,您可以了解线程的状态,如运行、阻塞、等待等,以便更好地理解应用程序的运行情况。
获取CPU飙高的进程PID

top命令用于监视 Linux 系统的实时进程和系统性能信息。那么我们可以通过top命令来实时定位到那个线程占用大量CPU资源。

输入命令:

top

可以看到PID列中进程id为8066的进程CPU占用率达到了98.7%,那么我们接下来排查的就是这个进程。

定位进程中的问题线程
top -H -p PID 

该命令的作用是在 top 工具中显示指定进程ID(PID)的线程级别信息。它将以线程级别的模式显示指定进程的各个线程的详细信息。

具体解释如下:

  • -H 选项指示 top 以线程级别的模式显示信息。
  • -p pid 选项指定需要显示信息的进程ID(PID)。在这个例子中,PID 为 8066 的进程的线程信息将被显示。

将PID进程号转为16进制

以上已定位具体线程pid导致CPU飙高,那么将指定pid转换为16进制,以便下一步定位具体线程问题使用。

将一个十进制的进程ID(PID)转换为十六进制格式的字符串,可以使用 printf 命令来实现。printf 命令可以根据指定的格式将数据进行格式化输出。

printf '0x%x\n' pid
定位指定线程问题
jstack pid | grep hexadecimal -A N

具体解释如下:

  • jstack pid 用于执行 jstack 命令并生成线程转储信息。
  • | 是管道符号,将 jstack 命令的输出传递给下一个命令。
  • grep hexadecimal 表示使用 grep 命令来匹配包含 "hexadecimal" 的行。
  • -A N 选项指定在匹配到的问题代码行后显示 N 行内容。

那么可以很快定位到是TestController类第20行出现了问题。

那么我们看代码:

arthas

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可以更快定位问题代码行。

更多使用技巧请参考官方文档:

Arthas


http://www.ppmy.cn/news/1047079.html

相关文章

自动驾驶——车辆动力学模型

/*lat_controller.cpp*/ namespace apollo { namespace control {using apollo::common::ErrorCode;//故障码 using apollo::common::Status;//状态码 using apollo::common::TrajectoryPoint;//轨迹点 using apollo::common::VehicleStateProvider;//车辆状态信息 using Matri…

网络安全领域的常见攻击方式及防御手段

目录 重放攻击(Replay Attack)防御手段 SQL 注入(SQL Injection)防御手段 跨站脚本攻击(Cross-Site Scripting,XSS)防御手段 跨站请求伪造(Cross-Site Request Forgery,C…

Android 13.0 强制app横屏显示

1.概述 在13.0产品定制化开发中,对于处理屏幕旋转方向,首先有kernel底层处理,从底层驱动gsensor 中获取数据,从而判断屏幕方向的,然后事件上报后 最后由WMS就是WindowManagerService 来处理旋转的相关事件 2.强制app横屏显示的核心类 /framework/base/services/java/com…

如何通过MAT排查生产环境服务内存溢出

前言 前段时间,运维反馈生产环境翻译服务某个节点触发内存告警了。运维在重启节点之前,生成了dump快照,这里介绍下如何使用MAT内存分析工具来排查服务内存高占用问题。 MAT简介 MAT是Memory Analyzer的简称,它是一款功能强大的…

为什么终端是1是从1到1的水仙花数呢

为什么终端是1是从1到1的水仙花数呢 #include<stdio.h> #include<math.h> int main() { int a,num_init,num; printf(“请输入水仙花数产生的下限值:”); num_init scanf(" %d", &num_init); printf(“请输入水仙花数产生的上限值:”); a scanf…

无重复字符的最长子串——力扣3

滑动窗口 int lengthOfLongestSubstring(string s){int n=s.size();unordered_set<char

基于YOLOv8模型和PCB电子线路板缺陷目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOv8模型PCB电子线路板缺陷目标检测系统可用于日常生活中检测与定位PCB线路板瑕疵&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检…

12_Redis为什么这么快高性能设计之epoll和IO多路复用深度解析

Redis为什么这么快&高性能设计之epoll和IO多路复用深度解析 一、before 多路复用要解决的问题 结论 二、IO多路复用模型 2.1 是什么 IO&#xff1a;网络IO多路&#xff1a;多个客户端连接&#xff08;连接就是套接字描述符&#xff0c;即socket或者channel&#xf…