news 2026/9/5 21:53:41

CPU 100% 高负载进阶排查与定位

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CPU 100% 高负载进阶排查与定位

本文基于 Rocky Linux 9 实战环境,通过人为制造 CPU 高负载故障,完整演示从vmstattoppspstreekill的 CPU 故障排查流程。


一、CPU 高负载排查思路

在 Linux 服务器中,如果监控系统发现:

CPU 使用率 > 90%

不要第一时间执行:

kill -9

正确的思路应该是:

CPU告警 ↓ 确认CPU是否真的繁忙 ↓ vmstat ↓ 判断CPU消耗类型 ↓ top ↓ 定位高CPU进程 ↓ ps ↓ 确认进程详细信息 ↓ pstree ↓ 分析进程父子关系 ↓ 判断异常原因 ↓ 正常停止 / kill / kill -9

核心思想:

先定位,再处理。


二、使用 vmstat 判断 CPU 状态

执行:

vmstat 1 5

含义:

1 → 每1秒采集一次 5 → 连续采集5次

示例:

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 5 0 0 365220 89784 1716832 0 0 1 23 4 1 1 1 98 0 0 4 0 0 365776 89784 1716816 0 0 0 76 7221 6896 22 78 0 0 0 4 0 0 365988 89784 1716816 0 0 0 4 7121 8171 22 78 0 0 0 4 0 0 365284 89784 1716840 0 0 0 100 7073 7678 22 79 0 0 0 6 0 0 367064 89784 1716848 0 0 0 84 7238 7834 23 77 0 0

三、重点分析us、sy、id、wa、st

CPU 部分:

us sy id wa st

分别表示:

参数含义
us用户态 CPU
sy内核态 CPU
idCPU 空闲时间
waI/O 等待
st被虚拟机偷走的 CPU 时间

1.us

例如:

us sy id wa st 95 2 3 0 0

说明:

CPU 主要消耗在用户态程序。

重点检查:

Java MySQL Python Nginx Shell 其他业务程序

下一步:

top

2.sy

例如:

us sy id wa st 22 78 0 0 0

说明大量 CPU 时间消耗在:

Linux内核 系统调用 网络 中断 进程调度 驱动

这种情况需要进一步分析。

注意:

sy高并不一定代表 Linux 内核本身有问题,也可能是某个用户程序进行了大量系统调用。

这次实验中的yes就属于这种情况。


3.wa

例如:

us sy id wa st 10 5 5 80 0

说明大量时间用于等待 I/O。

重点检查:

iostat -xz 1 5

以及:

iotop

重点关注磁盘性能和 I/O 请求。


4.st

例如:

us sy id wa st 20 5 5 0 70

说明虚拟机的 CPU 资源可能被宿主机抢占。

云服务器、VMware 虚拟机环境中尤其需要关注。


四、使用 top 定位高 CPU 进程

执行:

top

进入top后按:

P

按照 CPU 使用率排序。

本次实验得到:

PID USER %CPU %MEM COMMAND 2583901 root 97.0 0.1 yes 2583899 root 96.0 0.1 yes 2583900 root 95.3 0.1 yes 2583902 root 95.3 0.1 yes 46699 root 2.0 2.4 YDService 2542416 root 2.0 7.4 kube-apiserver 2542452 root 1.0 1.9 etcd 2542831 root 1.0 2.9 kubelet

此时非常明显:

yes yes yes yes

占用了绝大部分 CPU。


五、为什么四个 yes 能达到接近 400%?

本服务器为:

4 CPU

而每个:

yes ≈ 100%

所以:

97 + 96 + 95.3 + 95.3 ≈ 383%

意味着:

4 个 CPU 核心基本全部处于工作状态。

Linuxtop中,一个 CPU 核心可以达到约100%

所以:

单核 → 100% 双核 → 200% 四核 → 400%

这也是为什么多核服务器上看到:

%CPU = 300%

并不代表服务器“超出了100%”。


六、使用 ps 进一步确认进程

找到 PID 后,不要急着杀。

例如:

ps -p 2583900 -o pid,ppid,user,%cpu,%mem,etime,cmd

参数解释:

-p PID → 查询指定PID -o → 自定义输出字段 pid → 进程ID ppid → 父进程ID user → 运行用户 %cpu → CPU使用率 %mem → 内存使用率 etime → 进程运行时间 cmd → 启动命令

例如:

PID PPID USER %CPU %MEM ETIME CMD 2583900 1 root 95.3 0.1 01:16:25 yes

此时我们知道:

PID = 2583900 进程 = yes CPU = 95.3% PPID = 1

七、理解 PID 和 PPID

Linux 中每个进程都有自己的 PID。

例如:

PID 2583900

代表这个进程自己的编号。

而:

PPID

代表:

Parent Process ID,父进程 ID。

例如:

bash ↓ yes

那么:

bash → 父进程 yes → 子进程

假设:

bash PID = 1000 yes PID = 2000

那么:

PID 2000 PPID 1000

八、为什么 yes 的 PPID 是 1?

本次实验中:

ps -p 2583900 -o cmd,pid,ppid

得到:

CMD PID PPID yes 2583900 1

再查看 PID 1:

ps -p 1 -o cmd,pid,ppid

得到:

CMD PID PPID /usr/lib/systemd/systemd sh 1 0

说明:

PID 0 ↓ PID 1 systemd

Linux 的 PID 1 是非常重要的系统进程。

如果一个进程原来的父进程退出,子进程可能会被重新托管,由 PID 1 等进程接管。

因此:

yes ↓ PPID = 1

并不意味着 systemd 一定直接启动了这个 yes。


九、使用 pstree 查看进程关系

执行:

pstree -p

可以看到进程树。

如果只想查看某个进程:

pstree -p 2583900

pstree的作用就是:

以树状结构显示 Linux 进程之间的父子关系。

这在排查:

异常进程 服务启动关系 僵尸进程 孤儿进程 脚本启动的进程

时非常有用。


十、kill 的正确使用方法

找到异常进程以后,才进入处理阶段。

最基本:

kill PID

例如:

kill 2583900

默认发送:

SIGTERM

也就是信号:

15

它的含义是:

请求进程正常退出。


十一、kill -9 是什么?

kill -9 2583900

其中:

9 = SIGKILL

它会强制终止进程。

常见处理顺序:

kill PID ↓ 等待进程正常退出 ↓ 如果仍然存在 ↓ kill -9 PID

所以不要形成:

发现CPU高 ↓ kill -9

这样的习惯。


十二、一次杀多个 PID

本次实验中有四个yes

2583899 2583900 2583901 2583902

可以:

kill 2583899 2583900 2583901 2583902

如果无法正常退出,再:

kill -9 2583899 2583900 2583901 2583902

十三、按照进程名杀进程

如果确定需要按照进程名称处理,可以使用:

pkill yes

强制:

pkill -9 yes

也可以使用:

killall yes

但是生产环境需要特别注意:

按照名称杀进程可能误杀同名进程。

因此生产环境更推荐:

确认进程 ↓ 确认PID ↓ 确认业务 ↓ 针对PID处理

十四、为什么不能随便杀父进程?

例如:

父进程 ├── 子进程A ├── 子进程B └── 子进程C

如果直接:

kill 父进程PID

并不意味着:

子进程A 子进程B 子进程C

一定全部退出。

父进程结束以后,子进程可能继续运行,并被其他进程重新托管。

所以:

杀父进程 ≠ 自动杀死所有子进程。

如果是 systemd 管理的服务,通常应该优先:

systemctl stop 服务名

而不是直接杀某个进程。


十五、完整 CPU 排障案例

本次实验最终形成了完整的排障过程:

① 发现 CPU 异常 ↓ ② vmstat 1 5 ↓ ③ 发现 id=0 ↓ ④ 分析 us/sy/wa/st ↓ ⑤ top ↓ ⑥ 按 P 排序 ↓ ⑦ 发现 4 个 yes ↓ ⑧ 获取 PID ↓ ⑨ ps 查看 PPID、CPU、运行时间 ↓ ⑩ pstree 分析进程关系 ↓ ⑪ 确认是测试产生的异常进程 ↓ ⑫ kill PID ↓ ⑬ CPU恢复正常

十六、生产环境中的进阶判断

真正工作时,不要只停留在:

top

而应该根据vmstat的结果选择不同路线。

情况一:用户态 CPU 高

us 高

重点:

top ps

继续定位:

Java Python MySQL Nginx 业务程序

情况二:内核态 CPU 高

sy 高

继续调查:

mpstat -P ALL 1 5

以及:

cat /proc/interrupts

重点考虑:

系统调用 中断 网络 驱动 线程调度 内核活动

情况三:I/O 等待高

wa 高

执行:

iostat -xz 1 5

继续分析:

磁盘利用率 IOPS await 队列 读写压力

情况四:steal 高

st 高

重点检查:

虚拟机 云服务器 宿主机资源竞争
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/5 21:53:09

安卓推箱子课设高分源码解析:架构设计与工程规范

简介:这是一份面向计算机相关专业在校学生、教师及初学者的安卓开发实践资源,聚焦Android Studio平台下的经典推箱子小游戏实现,适用于期末大作业、课程设计、课设立项或毕设原型开发。资源包含59个文件,涵盖9个Java核心逻辑代码、…

作者头像 李华
网站建设 2026/9/5 21:51:09

全开源微教育小程序架构解析:营销模块与轻量化大数据实践

简介:这是一套面向教育行业数字化转型的全开源微信小程序源码,适用于在线教育机构、知识付费平台及教培从业者快速搭建具备营销与数据分析能力的轻量级教学平台。资源基于微教育3.15.22全能版深度定制,集成营销模块(如拼团、分销、…

作者头像 李华
网站建设 2026/9/5 21:46:15

Redisson 配置实战:从单节点到集群的完整调优路径

Redisson 配置实战:从单节点到集群的完整调优路径 【免费下载链接】redisson Redisson: Valkey & Redis Java Client and Real-Time Data Platform. Sync/Async/RxJava/Reactive API. Over 50 Valkey and Redis based Java objects and services: Set, Multimap…

作者头像 李华
网站建设 2026/9/5 21:44:33

AI Agent岗位化实践:用30+Skill搭建高效自动化工作流

最近一个多月我一直在折腾 Agent Skill,陆陆续续给手头的 AI 助手装了三十多个 Skill,干脆照着公司组织架构给 AI 分了八个岗位,从需求分析、架构设计、代码落地到测试验收一整套跑下来,效率比单开一个对话窗口高太多了。这篇文章…

作者头像 李华
网站建设 2026/9/5 21:43:24

Agent自主支付新范式:从HTTP 402到x402与AP2协议解析

最近我一直在研究 Agent 的自动化边界,结果被一条日志勾住了:它尝试调用某个付费的模型服务,对方返回了一个并不常见的 HTTP 状态码。不是 401 鉴权失败,也不是 403 权限不足,而是 402。按大多数人的理解,4…

作者头像 李华
网站建设 2026/9/5 21:40:22

如何快速构建与配置Brave浏览器:面向开发者的极简实战指南

如何快速构建与配置Brave浏览器:面向开发者的极简实战指南 【免费下载链接】brave-browser Brave browser for Android, iOS, Linux, macOS, Windows. 项目地址: https://gitcode.com/GitHub_Trending/br/brave-browser Brave浏览器是一款基于Chromium的开源…

作者头像 李华