工作中遇到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脚本来执行。
安装JDK命令行工具
服务器上安装的OpenJDK ,是否有常用的命令行工具?
验证是否安装
-  
[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优化、算法优化、快速返回等方法来最这段代码优化了。



京公网安备 11010502036488号