当前位置: 首页 > 科技观察

CPU100%,如何快速定位?

时间:2023-03-19 23:57:42 科技观察

作者|58神剑A机,CPU100%,如何查找相关服务,如何定位问题代码,今天简单分享一下自己的想法。假设服务器上部署了几个Java站点服务和几个Java微服务,突然收到运维的CPU异常告警。如何定位哪个服务进程导致CPU过载,哪个线程导致CPU过载,哪段代码导致CPU过载?简要步骤如下:找到最消耗CPU的进程;找到消耗CPU最多的线程;查看堆栈,定位线程在干什么,定位到对应的代码;Step1.找到消耗CPU最多的进程工具:top方法:执行top-c。显示进程运行信息列表,输入P(大写p),进程按照CPU利用率排序。Step2.找到消耗CPU最多的线程工具:top方法:top-Hp10765,显示一个进程TypeP(大写p)的线程运行信息列表,线程按照CPU占用率排序图:as如上图,进程10765里面,最耗CPU的线程的PID是10804。Step3.查看堆栈,定位到线程在做什么,定位到对应的代码。首先,将线程PID转换为十六进制。工具:printf方法:printf"%x\n"10804图:如上图,10804对应的16进制值为0x2a34。当然,这一步你可以使用计算器。之所以转为十六进制,是因为在栈中,线程id是用十六进制表示的。接下来,查看堆栈以找出线程正在做什么。工具:jstack方法:jstack10765|grep'0x2a34'-C5--color打印进程栈传递线程id和filter得到线程栈图标:如上图,找到CPU消耗高的线程对应的线程名“AsyncLogger-1,查看线程正在执行的代码栈,最后根据栈中的信息,找到对应的代码,大功告成!