Linux:服务器CPU突然飙到100%?一套“破案”命令组合拳带你精准定位
服务器CPU突然飙到100%?一套“破案”命令组合拳带你精准定位
导读:上期我们聊了8个高频基础命令,这期直接进入实战——当CPU使用率突然飙到100%、系统卡得连命令都要敲半天,你该如何应对?本文梳理了一套“从全局到局部、从进程到线程”的完整排查链路,附VMware实测截图,建议收藏备用。
写在前面
“喂,服务器卡爆了,赶紧看一下!”
这是运维最常听到的一句话。而当你 SSH 连上去,执行 top 一看——CPU 使用率 100%,系统负载飙升——然后呢?
很多刚入行的同事到这里就慌了,不知道该往哪个方向查。其实CPU飙升排查有清晰的套路可循,核心思路只有三步:
-
定方向:是用户态(
us)高、内核态(sy)高,还是 I/O 等待(wa)高? -
抓进程:是哪个具体进程在“搞事情”?
-
下结论:是业务突增、代码死循环、还是系统配置问题?
实验环境:VMware Workstation 17 + CentOS 7.9,2核CPU / 2GB内存。本期我们通过
stress工具人为制造CPU压力,一步步演示完整的排查过程。
第一幕:制造“案发现场”——CPU突然飙高
首先,我们用 stress 工具模拟一个“犯罪现场”:
bash
# 安装 stress(如果没有的话) yum install -y epel-release && yum install -y stress # 制造 CPU 满载:占用 2 个 CPU 核心,持续 300 秒 stress -c 2 --timeout 300
现在,CPU已经被“犯罪嫌疑人”吃满了。接下来我们开始破案。
第二幕:第一板斧——top 全局扫描,锁定“嫌疑人”
登录服务器后第一件事,执行 top:
bash
top

重点看两处:
① 看 %Cpu(s) 这一行——判断“犯罪类型”
text
%Cpu(s): 98.2 us, 1.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.5 si, 0.0 st
这行告诉你 CPU 时间都花在哪里了:
| 指标 | 含义 | 高值意味着什么 |
|---|---|---|
us(user) |
用户态进程占用 | 应用程序自己在猛算——查业务代码、死循环 |
sy(system) |
内核态占用 | 频繁系统调用或内核操作——查驱动、中断、上下文切换 |
wa(iowait) |
等待 I/O 完成 | 磁盘是瓶颈——别查CPU了,去查磁盘 |
hi(hardirq) |
硬中断处理 | 硬件中断过多(网卡/磁盘) |
si(softirq) |
软中断处理 | 网络流量过大或驱动问题 |
判断法则:
us高 → 查应用程序;sy高 → 查内核/系统调用;wa高 → 查磁盘 I/O。
本例中 us 接近 100%,说明是用户态进程在疯狂计算。
② 看进程列表——找到“犯罪嫌疑人”
在 top 界面:
-
按
P(大写):按 CPU 使用率降序排列 -
按
1:查看每个 CPU 核心的负载情况 -
按
c:显示完整的命令路径

找到那个 CPU 占用最高的进程,记下它的 PID(假设是 12345)和进程名(比如 stress)。
第三幕:第二板斧——pidstat 精准测量,确认“犯罪证据”
top 给了一个全局快照,但我们需要更精确的数据。pidstat 可以按进程统计 CPU 使用情况:
bash
# -u:查看 CPU;-p:指定进程;1:每秒采样;5:共采样5次 pidstat -u -p 12345 1 5
[此处插入截图:pidstat -u -p [PID] 1 5 的输出,红框圈出 %CPU 列]
输出示例:
text
Linux 3.10.0-1160.el7.x86_64 (localhost) 06/23/2026 _x86_64_ (2 CPU) 10:30:01 AM UID PID %usr %system %guest %wait %CPU CPU Command 10:30:02 AM 0 12345 98.00 1.00 0.00 0.00 99.00 0 stress 10:30:03 AM 0 12345 97.50 1.50 0.00 0.00 99.00 0 stress
关键列解读:
-
%usr:用户态 CPU 占用 -
%system:内核态 CPU 占用 -
%CPU:总 CPU 占用 -
%wait:等待 CPU 的时间占比
如果
%usr高 → 应用程序自身的问题(死循环、大量计算)。
如果%system高 → 频繁系统调用,可能是锁竞争或内核问题。
本例 %usr 接近 98%,再次确认是应用层代码的问题。
第四幕:第三板斧——perf top 深入解剖,找到“犯罪手法”
知道是哪个进程还不够,我们得知道它在执行什么代码。perf 是 Linux 内核自带的性能分析工具,可以精确定位到函数级别:
bash
# 实时显示指定进程的热点函数 perf top -p 12345
[此处插入截图:perf top -p [PID] 的输出,红框圈出占用最高的函数名]
输出会显示该进程中 CPU 占用最高的函数名。如果是 Java 应用,看到的是 JVM 编译后的方法名;如果是 C/C++ 应用,看到的是具体的函数调用。
进阶用法:如果想生成更详细的分析报告,可以用
perf record采样后生成火焰图:bash
perf record -g -p 12345 -- sleep 30 # 采样30秒 perf script > out.perf # 导出采样数据 # 然后用 FlameGraph 工具生成火焰图
第五幕:特殊情况——如果“嫌疑人”是 Java 应用
如果 CPU 飙升的进程是 Java 应用(比如 Tomcat、Spring Boot),排查链路稍有不同:
Step 1:用 top -H -p [PID] 找到 CPU 最高的线程 ID
bash
top -H -p 12345
Step 2:把线程 ID 从十进制转成十六进制
bash
echo "obase=16; 12345" | bc # 输出:3039
Step 3:用 jstack 导出 Java 线程栈,在文件中搜索十六进制线程 ID
bash
jstack 12345 > thread_dump.log # 然后打开 thread_dump.log,搜索 "0x3039"
找到对应的线程栈,就能看到具体是哪段代码在“搞事情”——通常是死循环、频繁 GC、或者大量的锁竞争。
常见 CPU 飙升根因速查表
| 现象 | 可能原因 | 排查工具 | 解决方案 |
|---|---|---|---|
%us 高 |
应用死循环、大量计算 | perf top、jstack |
优化代码、重启进程 |
%sy 高 |
频繁系统调用、上下文切换过高 | strace -p、vmstat 1 |
检查锁竞争、减少系统调用 |
%wa 高 |
磁盘 I/O 瓶颈 | iostat -x 1、iotop |
查慢SQL、换SSD、加内存缓存 |
%si 高 |
软中断过多(网络流量大) | cat /proc/interrupts |
检查网卡驱动、调整中断亲和性 |
| 单核 100% 其他核空闲 | 单线程应用瓶颈 | mpstat -P ALL 1 |
多线程改造、绑定 CPU 核心 |
| 负载高但 CPU 使用率低 | 大量进程在等待 I/O 或锁 | vmstat 1 看 r 列 |
查磁盘、查锁竞争 |
完整排查决策树(一图流)
text
收到 CPU 飙升告警
↓
top 全局扫描
↓
查看 %Cpu(s) 行
↓
┌────┴────┬─────────┬─────────┐
↓ ↓ ↓ ↓
us 高 sy 高 wa 高 si 高
↓ ↓ ↓ ↓
查应用 查系统调用 查磁盘 查网络/中断
↓ ↓ ↓ ↓
pidstat strace iostat /proc/interrupts
↓ ↓ ↓ ↓
perf top perf iotop 调整网卡
/jstack top 中断亲和性
心法:
top是总览仪表盘,告诉你哪里亮红灯;pidstat/perf是精准探测器,深入问题区域抓出具体进程。
结语 & 下期预告
CPU 飙升排查的核心不是背命令,而是建立“现象 → 指标 → 根因”的关联思维。当你看到 %us 高时能立刻想到“查应用代码”,看到 %wa 高时能立刻转向“查磁盘”,你的排查效率就已经超越绝大多数人了。
更多推荐



所有评论(0)