CPU 使用率到底是什么?
我们要理解 Linux 是如何计算 CPU 使用率的,CPU 的时间被划分为不同的状态,使用率就是这些状态所占时间的百分比。

-
us(user space) - 用户空间 CPU- 含义:CPU 执行用户进程(应用程序)所花费的时间。
- 高
us:通常意味着你的应用程序本身很繁忙,比如在进行大量计算、数据处理等,这是最常见的情况。
-
sy(system) - 内核空间 CPU- 含义:CPU 执行内核系统调用(如文件读写、网络收发、内存分配等)所花费的时间。
- 高
sy:可能意味着系统调用过于频繁,文件 I/O 或网络 I/O 成为瓶颈,一个不健康的程序可能会产生过多的系统调用。
-
ni(nice) - 优先级进程 CPU- 含义:执行通过
nice或renice命令修改了优先级的用户进程所花费的时间。nice值越高,优先级越低。 - 高
ni:通常有后台任务在执行,比如数据库的维护任务、编译任务等。
- 含义:执行通过
-
id(idle) - 空闲 CPU
(图片来源网络,侵删)- 含义:CPU 处于空闲状态,没有执行任何任务。
100% - us - sy - ni - wa - hi - si理论上等于id。id很高说明 CPU 资源充足。
- 含义:CPU 处于空闲状态,没有执行任何任务。
-
wa(I/O wait) - 等待 I/O 的 CPU- 含义:CPU 空闲,但在等待磁盘或网络 I/O 操作完成。
- 高
wa:这是一个非常关键的指标,它通常意味着磁盘或网络是瓶颈,而不是 CPU,CPU 闲着没事干,只能等着数据从磁盘或网络过来,你应该优先优化磁盘或网络,而不是 CPU。
-
hi(hardware interrupts) - 硬件中断- 含义:CPU 响应硬件设备(如网卡、磁盘控制器)发出的中断请求所花费的时间。
- 持续高
hi:通常指向某个硬件设备存在问题,例如网卡流量异常巨大或出现错误。
-
si(software interrupts) - 软件中断- 含义:内核对硬件中断进行处理后,执行相关的软件处理逻辑所花费的时间。
- 持续高
si:与hi类似,通常也是网络流量巨大或驱动问题的信号。
如何查看 CPU 使用率?
top - 实时动态视图 (最常用)
top 是一个交互式的进程查看器,可以实时显示系统资源使用情况。

top
关键解读:
- 第一行 (Tasks, %Cpu(s), KiB Mem, KiB Swap):
%Cpu(s)这一行是核心,你会看到us,sy,ni,id,wa,hi,si等所有 CPU 状态的百分比,这是判断 CPU 瓶颈类型的首要依据。KiB Mem显示总内存、已用、空闲、缓冲和缓存。
- 下面是一个进程列表:
%CPU:该进程的 CPU 使用率。COMMAND:进程名或命令。- 按
P键可以按%CPU降序排列,快速找到最耗 CPU 的进程。 - 按
M键可以按内存使用率降序排列。 - 按
q键退出。
htop - top 的增强版 (推荐)
htop 是 top 的一个更现代化、更友好的替代品,颜色编码、垂直/水平分割、鼠标操作等功能使其更易用。
# 如果没有,需要先安装 # CentOS/RHEL: sudo yum install htop # Ubuntu/Debian: sudo apt-get install htop htop
关键解读:
- 界面更直观,CPU 和内存的使用情况有彩色的条形图。
- 进程列表操作更便捷,可以直接用鼠标点击排序或杀死进程。
- 可以通过
F2键进入设置,自定义要显示的列。
vmstat - 虚拟内存统计
vmstat 提供了进程、内存、分页、块 I/O、 traps 和 CPU 活动的摘要信息。
# 每2秒刷新一次,共刷新5次 vmstat 2 5
关键解读:
r列:运行队列中进程的数量,如果这个数持续大于 CPU 的核心数,说明 CPU 负载很重。us,sy,id,wa,st:这些列的含义与top一致,但它们是自上次刷新以来的平均值。st(steal time) 是在虚拟化环境中,虚拟 CPU 等待物理 CPU 的时间,高st说明宿主机过载。
mpstat - 多 CPU/核心统计
mpstat 可以显示每个 CPU 核心的详细统计信息,这对于多核系统非常有用。
# 显示所有CPU的平均情况 mpstat # 每隔2秒刷新一次,显示每个核心的详细情况 mpstat -P ALL 2
关键解读:
- 你可以看到
CPU列为0,1,2... 的行,这表示每个物理核心的使用情况,如果某个核心us特别高,而其他核心很闲,说明你的应用可能没有做好多线程优化。
/proc/stat - CPU 信息的底层来源
所有上述命令的数据都来源于 /proc/stat 文件,你可以直接查看它。
cat /proc/stat
第一行 cpu 是所有核心的汇总,cpu0, cpu1 等是单个核心的数据,这是一个非常底层的接口,通常用于编写监控脚本。
CPU 使用率高,如何排查?
当发现 CPU 使用率持续很高时,遵循以下步骤进行排查:
第 1 步:初步定位
- 运行
htop或top。 - 观察
%Cpu(s)行,判断是哪种 CPU 状态高(us,sy,wa等)。us高:应用问题,进入第 2 步。sy高:系统调用问题,进入第 2 步。wa高:I/O 问题,不要急着杀进程,先检查磁盘和网络性能。hi/si高:硬件/驱动问题,检查网卡流量等。
第 2 步:找到元凶进程
- 在
htop中按P(大写) 按 CPU 使用率排序。 - 找到 CPU 使用率最高的那个或几个进程。
- 记下它们的 PID (进程ID) 和 COMMAND (命令名)。
第 3 步:深入分析进程
假设你发现了一个高 CPU 的进程,java (PID 1234)。
方法 A:使用 top 或 htop 的线程视图
这是最直接的方法。
# 在htop中,按 t 键可以显示/隐藏线程 # 按H键可以切换显示线程模式 # 找到高CPU的线程,记下它的线程ID (TID) # 在top中,按H键可以显示/隐藏线程 # 然后按 f 键,选择 "PID" 列,按 Enter 确认,这样就可以按线程排序了
方法 B:使用 ps 命令
# 显示所有进程,并按 %CPU 排序 ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu # 查看特定进程的线程 ps -Tp 1234 -o %cpu,tid,cmd # -Tp 1234: 显示PID为1234的线程 # -o %cpu,tid,cmd: 指定要显示的列:CPU使用率, 线程ID, 命令
方法 C:使用 pidstat (最推荐)
pidstat 是 sysstat 包的一部分,功能非常强大,可以监控特定进程的资源使用情况。
# 每隔2秒查看PID为123
