Java服务,CPU100%问题如何快速定位?

简介: 简要步骤如下:(1)找到最耗CPU的进程;(2)找到最耗CPU的线程;(3)查看堆栈,定位线程在干嘛,定位对应代码;

上篇《Java服务,内存OOM问题如何快速定位?》发布后,有朋友在评论留言,问CPU100%的性能问题,如何找到相关服务,如何定位问题代码,也非常考验技术人的功底,今天简单说下思路。 

假设,服务器上部署了若干Java站点服务,以及若干Java微服务,突然收到运维的CPU异常告警。如何定位是哪个服务进程导致CPU过载,哪个线程导致CPU过载,哪段代码导致CPU过载?


简要步骤如下:

(1)找到最耗CPU的进程

(2)找到最耗CPU的线程

(3)查看堆栈,定位线程在干嘛,定位对应代码


步骤一、找到最耗CPU的进程

工具 top 方法
  • 执行top -c ,显示进程运行信息列表
  • 键入P (大写p),进程按照CPU使用率排序
图示:
image.png

如上图,最耗CPU的进程PID为10765。 步骤二:找到最耗CPU的线程工具top方法

  • top -Hp 10765 ,显示一个进程的线程运行信息列表
  • 键入P (大写p),线程按照CPU使用率排序
图示:
image.png

如上图,进程10765内,最耗CPU的线程PID为10804。

  步骤三:查看堆栈,定位线程在干嘛,定位对应代码
首先, 将线程PID转化为16进制 工具 printf 方法 printf "%xn" 10804 图示:
image.png

如上图,10804对应的16进制是0x2a34,当然,这一步可以用计算器。 之所以要转化为16进制,是因为堆栈里,线程id是用16进制表示的。 接着,查看堆栈,找到线程在干嘛工具jstack方法jstack 10765 | grep '0x2a34' -C5 --color

  • 打印进程堆栈
  • 通过线程id,过滤得到线程堆栈
图示:
image.png

如上图,找到了耗CPU高的线程对应的线程名称“AsyncLogger-1”,以及看到了该线程正在执行代码的堆栈。

最后,
根据堆栈里的信息,找到对应的代码,搞定!
 希望对经常进行线上CPU问题排查的同学有帮助,如果有更好的实践,也欢迎分享。

本文转自“架构师之路”公众号,58沈剑提供。

目录
相关文章
|
4月前
|
SQL 监控 关系型数据库
【紧急救援】MySQL CPU 100%!一套组合拳教你快速定位并解决!
凌晨三点MySQL CPU飙至100%,业务瘫痪!本文亲历30分钟应急排障全过程:从紧急止血、定位慢查询、分析锁争用,到优化SQL与索引,最终恢复服务。总结一套可复用的排查路径与预防方案,助你告别深夜救火。
|
4月前
|
JSON Java 数据格式
java调用服务报错400
java调用服务报错400
125 6
java调用服务报错400
|
4月前
|
JSON Java 数据格式
java调用服务报错415 Content type ‘application/octet-stream‘ not supported
java调用服务报错415 Content type ‘application/octet-stream‘ not supported
297 6
|
6月前
|
存储 数据采集 搜索推荐
Java 大视界 -- Java 大数据在智慧文旅旅游景区游客情感分析与服务改进中的应用实践(226)
本篇文章探讨了 Java 大数据在智慧文旅景区中的创新应用,重点分析了如何通过数据采集、情感分析与可视化等技术,挖掘游客情感需求,进而优化景区服务。文章结合实际案例,展示了 Java 在数据处理与智能推荐等方面的强大能力,为文旅行业的智慧化升级提供了可行路径。
Java 大视界 -- Java 大数据在智慧文旅旅游景区游客情感分析与服务改进中的应用实践(226)
|
7月前
|
分布式计算 搜索推荐 算法
Java 大视界 -- Java 大数据在智慧养老服务需求分析与个性化服务匹配中的应用(186)
本篇文章探讨了Java大数据技术在智慧养老服务需求分析与个性化服务匹配中的应用。通过整合老年人健康数据与行为数据,结合机器学习与推荐算法,实现对老年人健康风险的预测及个性化服务推荐,提升养老服务的智能化与精准化水平,助力智慧养老高质量发展。
|
7月前
|
Arthas 监控 Java
Java死锁 如何定位?如何避免Java死锁?(图解+秒懂+史上最全)
Java死锁 如何定位?如何避免Java死锁?(图解+秒懂+史上最全)
Java死锁 如何定位?如何避免Java死锁?(图解+秒懂+史上最全)
|
Java BI Linux
从Java视角理解系统结构 (一) CPU上下文切换
本文是从Java视角理解系统结构连载文章 在高性能编程时,经常接触到多线程. 起初我们的理解是, 多个线程并行地执行总比单个线程要快, 就像多个人一起干活总比一个人干要快. 然而实际情况是, 多线程之间需要竞争IO设备, 或者竞争锁资源,导致往往执行速度还不如单个线程. 在这里有一个经常提及的概念就是: 上下文切换(Context Switch).
233 0
从Java视角理解系统结构 (一) CPU上下文切换
|
4月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
260 1