perf分析定位3

mermaid-diagram

 

下面给你一版可以用于研究生课堂/生产排障标准手册级别的完整答案。我会严格做到三点:

  • ✔ 每一步都有命令

  • ✔ 每一步都有判断依据(可决策)

  • ✔ 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对应映射关系(可写论文级)”

posted on 2026-05-20 17:48  小镇-做题家  阅读(10)  评论(0)    收藏  举报

导航