工作中遇到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 ,是否有常用的命令行工具?

验证是否安装

 
  1. [root@op-system ~]$ jstack -h

  2. Usage:

  3. jstack [-l] <pid>

  4. (to connect to running process)

  5. jstack -F [-m] [-l] <pid>

  6. (to connect to a hung process)

  7. jstack [-m] [-l] <executable> <core>

  8. (to connect to a core file)

  9. jstack [-m] [-l] [server_id@]<remote server IP or hostname>

  10. (to connect to a remote debug server)

如果输出如上内容表明,已经拥有工具,倘若没有,那么继续下面。

安装

  • 查看JDK版本

 
  1. [root@op-system ~]$ java -version

  2. openjdk version "1.8.0_201"

  3. OpenJDK Runtime Environment (build 1.8.0_201-b09)

  4. OpenJDK 64-Bit Server VM (build 25.201-b09, mixed mode)

  • 看openJDK有jstack的yum源

 
  1. [root@op-system ~]$ yum whatprovides '*/jstack'

  2. 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

  3. Repo : @updates

  4. Matched from:

  5. Filename : /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.201.b09-2.el7_6.x86_64-debug/bin/jstack

找到和JDK版本对应的yum源。

  • 安装

 
  1. [root@op-system ~]$ sudo yum install java-1.8.0-openjdk-devel-debug-1.8.0.201.b09-2.el7_6.x86_64

寻找问题所在

  • 查出使用率最高的进程

 
  1. [root@op-system ~]$ top

发现 123067 这个进程特别消耗CPU。

 

  • 查看进程中线程情况

 
  1. [root@op-system ~]$ top -p 123067 -H

发现 127510 这个线程特别消耗CPU,那么我们来看看这个线程到底是做什么的。

  • 十进制id转十六进制

 
  1. [root@op-system ~]$ printf "%x\n" 127510

  2. 1eaec

  • 使用jstack打印出线程的堆栈信息

 
  1. [root@op-system ~]$ jstack 123067 |grep 1eaec -A 100

从打印出来的信息中发现了很熟悉的代码,对,就是这里。

解决问题

那么既然找到了问题,我们就只能通过,数据库索引、SQL优化、算法优化、快速返回等方法来最这段代码优化了。