工作中遇到CPU使用率100%,不要慌,一起来找出原因并fix掉它。
记住这里大致流程,当线上突然遇到时,也不必手足无措。
找出CPU比较高的进程PID
top
打印该进程下线程的CPU占用比较高的tid
top -Hp {PID}
将该tid进行16进制转换id
printf "%x/n" {tid}
打印线程的堆栈信息
jstack {PID} |grep {id} -A 100
当然这四步的执行需要时间,但我们可以将这几步写成shell脚本来执行。
[root@op-system ~]$ jstack -h Usage: jstack [-l] <pid> (to connect to running process) jstack -F [-m] [-l] <pid> (to connect to a hung process) jstack [-m] [-l] <executable> <core> (to connect to a core file) jstack [-m] [-l] [server_id@]<remote server IP or hostname> (to connect to a remote debug server)
如果输出如上内容表明,已经拥有工具,倘若没有,那么继续下面。
查看JDK版本
[root@op-system ~]$ java -version openjdk version "1.8.0_201" OpenJDK Runtime Environment (build 1.8.0_201-b09) OpenJDK 64-Bit Server VM (build 25.201-b09, mixed mode)
看openJDK有jstack的yum源
[root@op-system ~]$ yum whatprovides '*/jstack' 1:java-1.8.0-openjdk-devel-debug-1.8.0.201.b09-2.el7_6.x86_64 : OpenJDK Development Environment 8 with full debug on Repo : @updates Matched from: Filename : /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.201.b09-2.el7_6.x86_64-debug/bin/jstack
找到和JDK版本对应的yum源。
安装
[root@op-system ~]$ sudo yum install java-1.8.0-openjdk-devel-debug-1.8.0.201.b09-2.el7_6.x86_64
查出使用率最高的进程
[root@op-system ~]$ top
发现 123067 这个进程特别消耗CPU。
查看进程中线程情况
[root@op-system ~]$ top -p 123067 -H
发现 127510 这个线程特别消耗CPU,那么我们来看看这个线程到底是做什么的。
十进制id转十六进制
[root@op-system ~]$ printf "%x/n" 127510 1eaec
使用jstack打印出线程的堆栈信息
[root@op-system ~]$ jstack 123067 |grep 1eaec -A 100
从打印出来的信息中发现了很熟悉的代码,对,就是这里。
那么既然找到了问题,我们就只能通过,数据库索引、SQL优化、算法优化、快速返回等方法来最这段代码优化了。