淘先锋技术网

首页 1 2 3 4 5 6 7

工作中遇到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优化、算法优化、快速返回等方法来最这段代码优化了。