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