CPU100%,怎么快速定位?

共 1592字,需浏览 4分钟

 ·

2022-12-10 03:57



一台机器,CPU100%,如何
找到相关服务
,如何
定位问题代码
,今天简单分享下思路。



 


假设,服务器上部署了若干Java站点服务,以及若干Java微服务,突然收到运维的CPU异常告警。

如何定位是哪个服务进程导致CPU过载,哪个线程导致CPU过载,哪段代码导致CPU过载?




简要步骤如下:



(1)找到最耗CPU的
进程

(2)找到最耗CPU的
线程

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






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



工具


top


方法



  • 执行
    top -c
    ,显示进程运行信息列表


  • 键入P (大写p),进程按照CPU使用率排序

图示:
e8872428a3416bc261c77fbe3927e406.webp如上图,最耗CPU的进程PID为10765。
 

步骤二:

找到最耗CPU的线程



工具


top


方法



  • top -Hp 10765
    ,显示一个进程的线程运行信息列表


  • 键入P (大写p),线程按照CPU使用率排序

图示:
c6d940d24266a7b47d9cdde3004af810.webp如上图,进程10765内,最耗CPU的线程PID为10804。
 

步骤三:查看堆栈,定位线程在干嘛,定位对应代码


首先,
将线程PID转化为16进制


工具


printf


方法


printf "%x\n"
10804
图示:
be7f2045408dbb549c066e9333086a6b.webp如上图,10804对应的16进制是0x2a34,当然,这一步可以用计算器。
 
之所以要转化为16进制,是因为堆栈里,线程id是用16进制表示的。
 
接着,
查看堆栈,找到线程在干嘛


工具


jstack

方法


jstack 10765 | grep '0x2a34' -C5 --color


  • 打印进程堆栈


  • 通过线程id,过滤得到线程堆栈

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

最后,

根据堆栈里的信息,找到对应的代码
,搞定!

 
希望对经常进行线上CPU问题排查的同学有帮助,如果有更好的实践,也欢迎分享。







架构师之路

-分享技术

思路




相关文章:
线上问题排查,这些命令你一定用得到!
顶尖的人都是怎么想的!(很残酷)


浏览 50
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报