Linux

Linux CPU 100% 排查

·6 分钟阅读·2090 字
📋 目录

【原题】

线上 CentOS 机器突然 CPU us% 持续 98%、系统 load 远超 CPU 核数,top 无法定位进程、kill 杀不死占用高 CPU 程序,简述分步排查实操流程,包含冷门排查命令。

【参考答案】

核心现象拆解:us 高 = 用户态 CPU 耗尽;load>核数 = 大量进程处于不可中断 / 就绪排队;top 看不到进程大概率:僵尸进程、内核线程、隐藏恶意进程(挂载 proc 伪装)、fork 炸弹、被劫持的隐藏进程;kill 无法终止:进程处于 D 不可中断睡眠、被 ptrace 附着、内核模块劫持、PID 复用 / 隐藏。

步骤 1:基础数据快照,先保存现场(避免故障复现时数据丢失)

bash

运行

# 冷门命令:抓取全量进程、CPU快照存入日志
sar -u 1 3 > cpu_snap.log
ps -efH > proc_snap.log
pidstat -u -p ALL 1 2 >> cpu_snap.log

pidstat是 top 平替,能精准按 PID 拆分用户态 CPU 占用,弥补 top 排序盲区。

步骤 2:排查 top 看不见的高占用进程

  1. 排查隐藏进程(恶意程序挂载伪造 /proc)

bash

运行

# 冷门:ls /proc | grep -E '[0-9]+' | awk '{print $1}' > pid.tmp && for i in $(cat pid.tmp);do if [ ! -d /proc/$i ];then echo "异常PID:$i";fi;done
mount | grep proc # 检查proc是否被恶意挂载替换

恶意进程会自建伪 /proc 目录,top 读取伪 proc 数据看不到真实 PID。 2. 排查内核态寄生线程(不在用户进程列表)

bash

运行

# 冷门查看内核线程占用:
cat /proc/schedstat
perf top -g # 无需pid直接看内核/用户函数CPU占用,定位无PID高耗CPU代码

perf top是大厂排查隐形 CPU 占用核心命令,无视进程伪装。

步骤 3:load 过高专项:D 态不可中断进程(kill 无法杀掉核心原因)

bash

运行

# 查找D(Uninterruptible Sleep)进程,常规top过滤不全
ps -eo pid,stat,cmd | awk '$2 ~ /D/'
# 冷门:查看阻塞在哪个内核资源(磁盘/内核锁)
wchan $(ps -eo pid,stat | awk '$2~/D/{print $1}')

D 进程卡在硬件 IO / 内核锁,kill -9 无效,只能重启或修复底层阻塞资源

步骤 4:kill 无法杀死进程分层排查

  1. 进程被 ptrace 调试附着(杀毒 / 恶意调试程序附着,无法被 kill)

bash

运行

grep TracerPid /proc/*/status | grep -v ":0"

TracerPid≠0 代表被别的进程附着,先杀掉附着进程才可终止原进程。 2. 僵尸进程 (z) 堆积拉高 load:父进程异常未收尸

bash

运行

# 筛选僵尸进程
ps -ef | grep defunct
# 查找僵尸进程父PID,kill父进程回收僵尸

僵尸进程不耗 CPU,但海量僵尸会抬升 load;若 us98%+ 僵尸共存,多为业务 fork 异常。 3. 内核模块劫持进程:进程表被 rootkit 篡改

bash

运行

lsmod | sort
chkrootkit # 运维冷门安全排查工具,排查内核级恶意模块

步骤 5:应急止血 + 根治

  1. 临时:perf 定位函数→找到真实 PID,D 进程优先修复阻塞磁盘 / 硬件;ptrace 劫持先杀附着进程;rootkit 恶意进程卸载异常内核模块。
  2. 长效:开启 proc 审计auditd,监控 /proc 挂载变更、进程创建,接入 Prometheus 监控 CPU + 进程状态。

【面试官延伸追问】

  1. 若 perf 也看不到异常用户态函数,us 持续高占用还有哪些极端场景?
  2. fork 炸弹导致 CPU 打满、瞬间生成上万进程,top 卡死无法操作,如何单命令快速恢复?
  3. 容器环境下宿主机 CPU us98%,宿主机 top 无高占用,如何定位容器内异常进程?

【踩坑易错点】

  1. 误区 1:load 高 = CPU 不够,直接升配;D 进程 / 僵尸进程大量堆积无 CPU 消耗也会 load 飙升。
  2. 误区 2:kill -9 反复执行无效就放弃,D 态 /ptrace 附着进程本身不受信号控制,杀不死是正常内核机制。
  3. 误区 3:只用 top 定位,忽略 perf、pidstat、wchan,隐藏进程场景 top 完全失效。

plaintext

## 配套标签快速归类
后续同类CPU故障题统一复用标签:`[Linux,CPU故障,故障排查,基础题]`

需要我把这道题单独导出文件名:`[Linux-基础-故障题-CPU98%找不到进程].md`规范命名吗?

关联文档

  • ../monitoring/perf 命令详解 — perf 工具
  • ../monitoring/perf top 与 top 命令区别 — 工具区别
  • 服务器 IO 过高排查流程 — IO 排查