# CPU 飙升

线上资源 cpu 飙升是我们工作中常见的问题,一篇文章搞定排查方法

# 一、问题复现

  • 现在我有两个接口,代码如下

    @RestController
    public class CPUCheck {
      @RequestMapping("/hello")
      public String helloWorld(){
          return "hello World";
      }
      @RequestMapping("/run")
      public void run(){
          while (true){
          }
      }
    }
  • 代码很简单 接口 1“/hello” 返回 “hello World”,接口 2“/run” 进入死循环,这样就保证了访问接口 2cpu 升高。

# 二、测试

  1. 我们将项目打包部署在服务器上,并启动

  2. 测试接口

    curl http://localhost:9901/thing-test/hello
    

image.png

# 三、排查

  1. 通过 top 命令可以查看到有一个 java 进程占用 cpu 资源异常

  2. 获取 pid 为 32306

  3. 通过命令查询 tid

    命令:ps -mp 【pid】 -o THREAD,tid,time
    实例:ps -mp 32306 -o THREAD,tid,time

image.png

  1. 可以看到引起 cpu 异常的 tid 是 32327

  2. 因为现在的 tid 32327 是十进制的,需要将其转化为十六进制

    命令:printf "%x\n" 【十进制tid】
    实例:printf "%x\n" 32327
    

    <img src="../images/CPU 飙升排查_img/bVc7FaD.png" alt="image.png" style="zoom: 150%;" />

  3. 根据 pid 和 tid 查询导致 cpu 飙升的代码

    命令:jstack 【10进制pid】 | grep 【16进制tid】 -A 20
    实例:jstack 32306 | grep 7e47 -A 20

    image.png

image.png


end....

更新于

请我喝[茶]~( ̄▽ ̄)~*

GuoYang 微信支付

微信支付

GuoYang 支付宝

支付宝