Linux?CPU占用過高的原因與排查指南
1. 前言
Linux 服務器 CPU 占用過高,是線上排障中非常常見的問題。
常見現(xiàn)象包括:
- 接口響應變慢;
- SSH 登錄卡頓;
- 服務線程堆積;
- 負載 Load Average 升高;
- 風扇轉速變高;
- 進程占用 CPU 長時間不下降。
排查 CPU 問題,不能只看一個 top。
更合理的方式是結合:
top ps pidstat uptime mpstat perf 應用日志
本文重點圍繞 top、ps、pidstat 展開,講清楚 Linux CPU 占用過高時怎么定位到具體進程、線程和可能原因。
2. CPU 占用高可能是什么原因
CPU 高并不一定是壞事。
如果服務器正在正常處理大量請求,CPU 高可能是正常負載。
但如果 CPU 持續(xù)高位,就要重點排查。
常見原因:
| 類型 | 說明 |
|---|---|
| 業(yè)務請求量突增 | 流量變大,服務正常忙 |
| 死循環(huán) | 某段代碼一直空轉 |
| 線程池打滿 | 大量線程爭搶 CPU |
| GC 頻繁 | Java 程序頻繁垃圾回收 |
| 正則或加密計算過重 | CPU 密集型任務 |
| 日志瘋狂打印 | 大量字符串拼接和 IO |
| 異常進程 | 挖礦、木馬、未知腳本 |
| 系統(tǒng)中斷高 | 網(wǎng)卡、磁盤、驅動異常 |
所以排查時要先判斷:
是哪個進程高? 是用戶態(tài) CPU 高,還是系統(tǒng)態(tài) CPU 高? 是單線程高,還是多線程高? CPU 高是否和業(yè)務流量一致?
3. top:第一時間看整體情況
執(zhí)行:
top
重點看頂部幾行:
%Cpu(s): 85.0 us, 10.0 sy, 0.0 ni, 3.0 id, 1.0 wa, 0.0 hi, 1.0 si, 0.0 st
字段說明:
| 字段 | 含義 |
|---|---|
us | 用戶態(tài) CPU,業(yè)務程序代碼消耗 |
sy | 系統(tǒng)態(tài) CPU,內核調用消耗 |
id | 空閑 CPU |
wa | 等待 IO |
hi | 硬中斷 |
si | 軟中斷 |
st | 虛擬化環(huán)境中被宿主機偷走的 CPU |
判斷思路:
| 現(xiàn)象 | 可能方向 |
|---|---|
us 高 | 應用程序計算多、死循環(huán)、GC、業(yè)務壓力大 |
sy 高 | 系統(tǒng)調用多、網(wǎng)絡/文件操作頻繁 |
wa 高 | 磁盤 IO 慢,不一定是 CPU 真忙 |
hi/si 高 | 網(wǎng)絡包、中斷、驅動相關問題 |
st 高 | 云主機宿主機資源爭搶 |
4. top 中按 CPU 排序
進入 top 后按:
P
可以按 CPU 占用排序。
常見字段:
| 字段 | 說明 |
|---|---|
PID | 進程 ID |
USER | 進程用戶 |
%CPU | CPU 占用 |
%MEM | 內存占用 |
TIME+ | 累計 CPU 時間 |
COMMAND | 命令名 |
如果某個進程長期排第一,基本就是重點對象。
查看某個進程詳細信息:
ps -fp PID
例如:
ps -fp 12345
5. ps:快速找 CPU 最高的進程
查看 CPU 占用最高的前 10 個進程:
ps aux --sort=-%cpu | head
輸出示例:
USER PID %CPU %MEM COMMAND app 1234 180 20.1 java -jar app.jar root 2345 60 1.2 nginx
說明:
%CPU可能超過 100;- 多核 CPU 下,一個進程多線程可以占用超過 100%。
查看指定進程:
ps -p 1234 -o pid,ppid,user,%cpu,%mem,etime,cmd
字段說明:
| 字段 | 含義 |
|---|---|
pid | 進程 ID |
ppid | 父進程 ID |
%cpu | CPU 占用 |
%mem | 內存占用 |
etime | 運行時長 |
cmd | 啟動命令 |
6. pidstat:持續(xù)觀察進程 CPU
pidstat 來自 sysstat 工具包。
安裝:
Ubuntu / Debian:
sudo apt install sysstat -y
CentOS / RHEL:
sudo yum install sysstat -y
查看所有進程 CPU,每 1 秒一次:
pidstat 1
查看指定進程:
pidstat -p 1234 1
輸出示例:
UID PID %usr %system %guest %wait %CPU CPU Command app 1234 80.0 10.0 0.0 0.0 90.0 1 java
字段說明:
| 字段 | 含義 |
|---|---|
%usr | 用戶態(tài) CPU |
%system | 系統(tǒng)態(tài) CPU |
%wait | 等待 CPU 調度 |
%CPU | 總 CPU 占用 |
CPU | 當前運行在哪個 CPU 核心 |
pidstat 比 top 更適合連續(xù)觀察趨勢。
7. 定位到線程級別
有些進程內部有很多線程。
例如 Java、Nginx、MySQL 都可能是多線程或多進程模型。
查看某進程的線程 CPU:
top -H -p 1234
或者:
ps -mp 1234 -o THREAD,tid,time,%cpu
找到占用高的線程 TID 后,如果是 Java 程序,可以把 TID 轉成十六進制:
printf "%x\n" 線程ID
例如:
printf "%x\n" 5678
然后用:
jstack 1234 | grep -A 30 十六進制線程ID
定位 Java 線程堆棧。
8. mpstat:看每個 CPU 核心
如果懷疑單核打滿,可以用:
mpstat -P ALL 1
如果某一個 CPU 核心長期 100%,可能是:
- 單線程程序跑滿;
- 中斷集中在某個核心;
- 線程綁定 CPU;
- 某個熱點線程異常。
9. CPU 高的實戰(zhàn)排查流程
9.1 看整體 CPU
top
重點看:
us sy wa hi si st
9.2 找最高進程
ps aux --sort=-%cpu | head
9.3 持續(xù)觀察
pidstat -p PID 1
9.4 看線程
top -H -p PID
9.5 查日志和應用狀態(tài)
journalctl -u 服務名 -n 100 tail -f app.log
9.6 如果是 Java
jstack PID jstat -gcutil PID 1000
看是否頻繁 GC 或線程死循環(huán)。
10. 常見場景判斷
10.1 用戶態(tài) CPU 高
top 中 us 高。
常見原因:
- 業(yè)務計算量大;
- 死循環(huán);
- 大量 JSON 序列化;
- 加密解密;
- 正則匹配;
- Java GC;
- 大量請求。
處理思路:
找進程 找線程 看代碼堆棧 看接口流量 看日志
10.2 系統(tǒng)態(tài) CPU 高
sy 高。
常見原因:
- 大量系統(tǒng)調用;
- 網(wǎng)絡連接頻繁創(chuàng)建關閉;
- 文件 IO 很頻繁;
- 容器或內核網(wǎng)絡開銷;
- 進程頻繁 fork。
可以結合:
strace -p PID
觀察系統(tǒng)調用。
線上使用 strace 要謹慎,避免影響進程。
10.3 iowait 高
wa 高不代表 CPU 真忙。
它通常表示 CPU 在等磁盤 IO。
繼續(xù)排查:
iostat -x 1 iotop
如果磁盤很忙,要去看 IO 問題,而不是只盯 CPU。
11. 不要一上來 kill -9
發(fā)現(xiàn) CPU 高后,不建議直接:
kill -9 PID
除非已經(jīng)確認是異常進程。
更穩(wěn)妥:
- 先記錄現(xiàn)場;
- 保存日志;
- 查看進程命令;
- 查看線程;
- 必要時 dump;
- 再考慮重啟或 kill。
Java 程序可以先:
jstack PID > jstack.txt jmap -histo PID > histo.txt
然后再處理。
12. 小結
CPU 高排查核心命令:
top ps aux --sort=-%cpu | head pidstat -p PID 1 top -H -p PID mpstat -P ALL 1
排查思路:
先看整體 CPU 類型 ↓ 找出高 CPU 進程 ↓ 持續(xù)觀察進程趨勢 ↓ 定位到線程 ↓ 結合應用日志和代碼堆棧 ↓ 判斷是流量、死循環(huán)、GC、IO 還是異常進程
CPU 排查最重要的是不要只看表面占用率,而要判斷 CPU 時間到底消耗在用戶態(tài)、系統(tǒng)態(tài)、IO 等待還是中斷上。
以上就是Linux CPU占用過高的原因與排查指南的詳細內容,更多關于Linux CPU占用過高排查的資料請關注腳本之家其它相關文章!
相關文章
Linux基于TCP實現(xiàn)服務端客戶端通信的步驟詳解
文章詳細介紹了Linux系統(tǒng)中的前臺進程和后臺進程的概念、創(chuàng)建、切換和操作方法,以及進程關系、守護進程、TCP服務器與客戶端通信等方面的內容,需要的朋友可以參考下2026-03-03
Openssl實現(xiàn)雙向認證教程(附服務端客戶端代碼)
這篇文章主要介紹了Openssl實現(xiàn)雙向認證教程(附服務端客戶端代碼),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-05-05
centos7訪問windows系統(tǒng)的共享文件夾詳解
文章講述了在Windows和CentOS系統(tǒng)之間共享文件夾并掛載的過程,包括在Windows上設置共享文件夾,以及在CentOS上使用CIFS協(xié)議掛載共享文件夾的詳細步驟,此外,還介紹了如何設置開機自動掛載和提高掛載點權限的安全性2025-12-12

