perf分析定位3

下面给你一版可以用于研究生课堂/生产排障标准手册级别的完整答案。我会严格做到三点:
-
✔ 每一步都有命令
-
✔ 每一步都有判断依据(可决策)
-
✔ perf + BCC + ps 三条链路闭环
-
✔ 能从 load → PID → PPID → root cause 收敛
🧠 Linux Load Average 完整分析体系(研究生/导师级标准版)
一、先定义“load到底是什么”(必须统一)
Load Average =
runnable tasks (TASK_RUNNING)
+ uninterruptible sleep (TASK_UNINTERRUPTIBLE / D state)
❗关键结论(必须记住)
| 指标 | 含义 |
|---|---|
| CPU usage | CPU在忙什么 |
| load average | 有多少任务“在等 CPU 或 kernel资源” |
二、第一步:确认 load 类型(必须先做)
✔ 1. vmstat(核心入口)
vmstat 1
✔ 判断规则(严格)
看 r (run queue):
r <= CPU核数:
→ CPU不拥塞(排除CPU调度问题)
r > CPU核数 × 1.5:
→ CPU调度风暴(runqueue overload)
--------------------------------------
看 b (blocked):
b > 0:
→ IO / D-state / kernel wait
b = 0:
→ 非IO问题(偏CPU或softirq)
三、第二步:定位“是谁在贡献 load”(PID层)
✔ 1. CPU + PPID 总览
ps -eo pid,ppid,state,comm,%cpu,%mem --sort=-%cpu | head -30
✔ 判断规则(必须掌握)
情况A:
多个进程CPU都中等偏高
→ 分布式负载(线程池/worker)
情况B:
单个PID极高
→ 单点CPU热点
情况C:
CPU整体不高但load高
→ 调度/IO问题(关键异常)
✔ 2. 找 R / D 状态进程(load核心)
ps -eo pid,ppid,state,wchan:30,cmd | egrep " R | D "
✔ 判断规则
R很多:
→ CPU runqueue backlog(调度压力)
D很多:
→ IO / disk / lock / kernel wait
✔ 3. PPID归属链(必须做)
pstree -aps <PID>
或:
ps -fp <PPID>
✔ 判断意义(必须明确)
PID = 执行单位
PPID = 服务归属单位(root cause入口)
四、第三步:perf分析(执行层)
✔ 1. perf top(CPU是否有热点)
perf top -a -s comm,pid,dso
✔ 判断规则(关键)
情况A:单函数 >5%
→ CPU bound问题
情况B:所有函数 <1%
→ ❗不是CPU问题(调度/softirq)
情况C:kernel函数分散
→ 系统级压力(network/sched)
✔ 2. perf sched(调度真相)
perf sched record -- sleep 10
perf sched timehist
✔ 判断规则
wait time高:
→ runqueue backlog(load核心来源)
context switch高:
→ 线程风暴 / 竞争
latency分散:
→ softirq / wakeup风暴
✔ 3. perf stat(调度压力量化)
perf stat -e context-switches,cpu-migrations,task-clock -a sleep 10
✔ 判断规则
context-switches暴涨:
→ CPU不是忙,是“被切碎”
cpu-migrations高:
→ NUMA / 负载不均
task-clock低但load高:
→ ❗调度问题(典型异常)
五、第四步:BCC(内核真相层)
✔ 1. runqueue(load本体)
runqlat
✔ 判断规则
P99 latency高:
→ CPU调度瓶颈(load真实来源)
平均低:
→ CPU不是问题
✔ 2. runqslower(直接找罪魁祸首)
runqslower 1
✔ 输出意义
PID X blocked 120ms
→ 直接定位 load贡献者
✔ 3. softirq(网络类load)
cat /proc/softirqs
或:
softirqs
✔ 判断规则
NET_RX高:
→ 网络驱动型load
分散到多个CPU:
→ RSS正常
集中单核:
→ IRQ imbalance
✔ 4. profile(终极定位)
profile -F 99
✔ 判断规则
kernel stack高:
→ 内核瓶颈
user stack高:
→ 应用瓶颈
无热点:
→ 调度问题(最关键)
六、完整决策树(必须掌握)
flowchart TD
A[load high] --> B{vmstat r/b}
B -->|r高| C[CPU调度风暴]
B -->|b高| D[IO / D-state问题]
B -->|正常| E[softirq / 伪load]
C --> F[perf sched + runqlat]
D --> G[ps D-state + IO分析]
E --> H[softirq + perf分散分析]
F --> I[PID/PPID归因]
G --> I
H --> I
七、PID → PPID → 根因链(最终闭环)
✔ 归因路径
PID(worker)
↓
PPID(service)
↓
systemd / k8s / supervisor
↓
业务模块(vector / haproxy / ES / etc)
✔ 判断目标
不是找“哪个PID高”
而是找:
→ 谁在制造 runqueue / softirq / D-state
八、三大根因模型(最终分类)
✔ 1. CPU型
perf hotspot明显
CPU us高
vmstat r高
✔ 2. 调度型(最常见)
perf无热点
vmstat r高
context switch高
✔ 3. softirq型
si > 3%
net_rx明显
perf分散
✔ 4. IO / D-state型
b > 0
D状态进程多
perf无热点
九、最终总结(导师级表达)
Load Average 本质不是 CPU 利用率问题,
而是 Linux 调度子系统中:
runnable queue + blocked queue
在时间维度上的积压结果。
perf 只能看到“执行”,
vmstat/BCC 才能看到“排队”,
ps/PPID 才能看到“责任归属”。
十、一句话课堂总结(可直接讲课用)
load average 是 Linux 调度压力的积分结果,而 perf 只能解释 CPU 在执行什么,真正的根因必须通过 vmstat + sched + BCC 才能定位到 PID/PPID 级别的系统归属链。
如果你下一步需要,我可以帮你再升级一版(更偏研究生课题级):
👉 “Linux load average 数学模型 + 调度器队列理论 + perf/bcc对应映射关系(可写论文级)”
浙公网安备 33010602011771号