# Linux-排查CPU只用率很高

### 背景-线上告警

某服务器CPU使用率达到99%，排查是哪个程序哪个线程导致的高CPU,及原因

### 排查思路

1、先找到耗CPU高的进程

2、找到耗CPU高的线程

3、找到耗CPU高的线程对应的业务代码；

## 操作步骤

### 步骤一: 找到CPU高进程

```bash
top -c   # 显示进程运行信息列表，键入大写P，按CPU使用率降序排列
```

<figure><img src="https://2134947750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvILwbD2PrkBCkSitM3m4%2Fuploads%2FI7Q5xUe460TLb3bTbSfN%2Fimage.png?alt=media&#x26;token=438ce6c5-c9c0-4364-8018-29fc73077f31" alt=""><figcaption></figcaption></figure>

### **步骤二：** 找到占用CPU高的进程ID(这里的进程ID是10765)之后，查看是哪些线程占用CPU高，命令如下：

```bash
ps H -eo pid,tid,%cpu | grep 10765
## 或者
top -Hp 10765  # 显示进程ID为10765的线程列表，键入大写P后，按CPU使用率降序排列

```

<figure><img src="https://2134947750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvILwbD2PrkBCkSitM3m4%2Fuploads%2FPYv2cuJuiYbaEsK10AMr%2Fimage.png?alt=media&#x26;token=54fa354f-7604-4a63-bcda-dda6cab4503d" alt=""><figcaption></figcaption></figure>

```bash
printf "%x\n" 10804  # PID 10804的线程，CPU使用率最高2.3%, 将线程ID(10804)按16进制展示
```

<figure><img src="https://2134947750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvILwbD2PrkBCkSitM3m4%2Fuploads%2FsAO84vnwxDeVKeE1oFGy%2Fimage.png?alt=media&#x26;token=f4c99b9c-4c81-4767-bb28-530c98b95537" alt=""><figcaption></figcaption></figure>

> 至此，找到了CPU使用率最高的线程ID为10804，并获取到10804的16进制标识：2a34
>
> (转为16进制，是因为jstack打印出的线程栈信息中，线程id是通过16进制展示的)

### 步骤三: 打印线程栈信息

通过jstack检索到进程(进程ID=10765)中，最耗CPU的线程(线程ID=2a34)的线程栈信息； 执行指令

```bash
jstack 10765 | grep "2a34" -C5 --color
```

<figure><img src="https://2134947750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvILwbD2PrkBCkSitM3m4%2Fuploads%2F08wrJ22RGelLEm8GBvPs%2Fimage.png?alt=media&#x26;token=8e63a80a-aeae-4926-a41e-58966127a59c" alt=""><figcaption></figcaption></figure>

至此，找到了耗CPU高的线程对应的线程名称“AsyncLogger-1”，而这个线程名称是我们业务代码中给线程取的名称，可以快速定位到业务代码。

\ <mark style="color:red;">**tips：给线程取一个与业务处理相关的名称，对快速定位问题尤为重要。**</mark>

如果我们没有给线程取名称“AsyncLogger-1”，那打印出来的线程名称可能是：

<figure><img src="https://2134947750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FvILwbD2PrkBCkSitM3m4%2Fuploads%2FYZPK6NlB9qJBYi8VXfmu%2Fimage.png?alt=media&#x26;token=c6f08f4c-3b61-4880-8d39-bfada4419872" alt=""><figcaption></figcaption></figure>

通过不知名的线程名称“pool-5-thread-1”，以及只包含jdk代码的线程栈信息，我们无法定位到业务代码。

\ <br>
