服务器CPU突然飙到100%?一套“破案”命令组合拳带你精准定位

导读:上期我们聊了8个高频基础命令,这期直接进入实战——当CPU使用率突然飙到100%、系统卡得连命令都要敲半天,你该如何应对?本文梳理了一套“从全局到局部、从进程到线程”的完整排查链路,附VMware实测截图,建议收藏备用。

写在前面

“喂,服务器卡爆了,赶紧看一下!”

这是运维最常听到的一句话。而当你 SSH 连上去,执行 top 一看——CPU 使用率 100%,系统负载飙升——然后呢?

很多刚入行的同事到这里就慌了,不知道该往哪个方向查。其实CPU飙升排查有清晰的套路可循,核心思路只有三步:

  1. 定方向:是用户态(us)高、内核态(sy)高,还是 I/O 等待(wa)高?

  2. 抓进程:是哪个具体进程在“搞事情”?

  3. 下结论:是业务突增、代码死循环、还是系统配置问题?

实验环境: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 topjstack 优化代码、重启进程
%sy 高 频繁系统调用、上下文切换过高 strace -pvmstat 1 检查锁竞争、减少系统调用
%wa 高 磁盘 I/O 瓶颈 iostat -x 1iotop 查慢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 高时能立刻转向“查磁盘”,你的排查效率就已经超越绝大多数人了。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐