Linux-排查CPU只用率很高
背景-线上告警
某服务器CPU使用率达到99%,排查是哪个程序哪个线程导致的高CPU,及原因
排查思路
1、先找到耗CPU高的进程
2、找到耗CPU高的线程
3、找到耗CPU高的线程对应的业务代码;
操作步骤
步骤一: 找到CPU高进程
top -c # 显示进程运行信息列表,键入大写P,按CPU使用率降序排列

步骤二: 找到占用CPU高的进程ID(这里的进程ID是10765)之后,查看是哪些线程占用CPU高,命令如下:
ps H -eo pid,tid,%cpu | grep 10765
## 或者
top -Hp 10765 # 显示进程ID为10765的线程列表,键入大写P后,按CPU使用率降序排列

printf "%x\n" 10804 # PID 10804的线程,CPU使用率最高2.3%, 将线程ID(10804)按16进制展示

至此,找到了CPU使用率最高的线程ID为10804,并获取到10804的16进制标识:2a34
(转为16进制,是因为jstack打印出的线程栈信息中,线程id是通过16进制展示的)
步骤三: 打印线程栈信息
通过jstack检索到进程(进程ID=10765)中,最耗CPU的线程(线程ID=2a34)的线程栈信息; 执行指令
jstack 10765 | grep "2a34" -C5 --color

至此,找到了耗CPU高的线程对应的线程名称“AsyncLogger-1”,而这个线程名称是我们业务代码中给线程取的名称,可以快速定位到业务代码。
tips:给线程取一个与业务处理相关的名称,对快速定位问题尤为重要。
如果我们没有给线程取名称“AsyncLogger-1”,那打印出来的线程名称可能是:

通过不知名的线程名称“pool-5-thread-1”,以及只包含jdk代码的线程栈信息,我们无法定位到业务代码。
Last updated