一、前言
你有沒有遇到過這種情況,Linux服務(wù)器CPU占用率達(dá)到100%且一直居高不下,嚴(yán)重影響業(yè)務(wù)系統(tǒng)的正常使用,這時候領(lǐng)導(dǎo)讓你來排查問題原因,如果不知道該如何下手,就有點尷尬了。
image-20230613081446144.png
二、排查五步法
排查思路總共分為五步,按照步驟操作,只要你有手就行。正確的排查方法,有助于快速的定位并解決問題。
- top 命令定位應(yīng)用進(jìn)程 pid
- top -Hp [pid] 定位應(yīng)用進(jìn)程對應(yīng)的線程 tid
- printf "%x\n" [tid] 將tid轉(zhuǎn)換為十六進(jìn)制
- jstack [pid] | grep -A 10 [tid的十六進(jìn)制] 打印堆棧信息
- 根據(jù)堆棧信息分析問題
三、示例實戰(zhàn)
示例代碼
package com.example.demo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* CPU占用率測試方法
*/
@RequestMapping("/api")
@RestController
public class CpuTestController {
@GetMapping("/cpu/{count}")
public long cpuRunning(@PathVariable("count") long count) {
long result = 0;
for (int i = 0; i < count; i++) {
result++;
}
return result;
}
}
調(diào)用接口:curl http://localhost:8080/api/cpu/10000000000,發(fā)現(xiàn)CPU一會兒就飆到了100%,接下來我們按五步法探個究竟。
第一步:找到最耗CPU的進(jìn)程pid
// 執(zhí)行 top 命令,按shift + p 組合鍵,按照CPU占用率排序
top
image-20230613081813516.png
從圖中,我們可以看到進(jìn)程pid為 24060 的占用CPU是最高的,直接是100%。
第二步:找到最耗CPU的線程tid
// 執(zhí)行 top -Hp [pid] 定位應(yīng)用進(jìn)程對應(yīng)的線程 tid
// 按shift + p 組合鍵,按照CPU占用率排序
top -Hp 24060
image-20230613081934103.png
從圖中,我們可以看到線程tid為 24077 占用CPU是最高的,達(dá)到99.9%。
第三步:將線程pid轉(zhuǎn)化為16進(jìn)制
// printf "%x\n" [tid] 將tid轉(zhuǎn)換為十六進(jìn)制
// 5e0d
printf "%x\n" 24077
第四步:查看線程的堆棧信息
// jstack [pid] | grep -A 10 [tid的十六進(jìn)制] 打印堆棧信息
jstack 24060 | grep -A 10 5e0d
image-20230613082203067.png
我們不難發(fā)現(xiàn)原來是 CpuTestController 的第18行出現(xiàn)了問題。
第五步:根據(jù)堆棧信息分析問題
找到對應(yīng)的代碼看一下,定位問題,優(yōu)化代碼邏輯
image-20230613082334766.png
四、總結(jié)
當(dāng)然,除了使用上面的基礎(chǔ)方法外,還有很多工具可以直接使用,例如阿里的Arthas。