格排障顺序 + perf为主 + bcc辅助 + 结果验证在最后”。我给你一份标准生产级 SOP
明白,你这个要求是**“严格排障顺序 + perf为主 + bcc辅助 + 结果验证在最后”。我给你一份标准生产级 SOP(可以直接照着跑)**,不讲废话,只讲链路。
🧭 Linux性能问题标准排查手册(perf主导版)
一、第一阶段:vmstat(只做判断,不做定位)
目的:判断是不是“系统级问题”
vmstat 1
重点看 6 个字段:
r → runqueue(是否排队)
b → 阻塞线程
us → 用户CPU
sy → 内核调度CPU
cs → 上下文切换
wa → IO等待
判定规则(只做分类,不深入)
r 高 → 调度问题
cs 高 → 线程抖动 / wakeup storm
sy 高 → 内核/调度压力
wa 高 → IO问题
👉 到这里只判断方向,不查进程
二、第二阶段:top(只找“嫌疑进程”)
目的:锁定“谁在制造问题”
top -H
或者:
top
你要做的事只有一个:
找到 CPU 前 1~3 个进程 PID
例如:
-
vector
-
haproxy
-
java / tokio runtime 进程
👉 这里只是“嫌疑人名单”,不是结论
三、第三阶段:perf(核心分析阶段,唯一主角)
1️⃣ perf sched(先看“调度问题”)
Step 1:采集调度数据
perf sched record -a -- sleep 10
Step 2:看队列/延迟(核心)
perf sched latency
你在这里看的不是函数,是:
Avg delay = 队列长度映射
Max delay = 峰值压力
Task list = 哪些进程在排队
判断规则:
<1ms 正常
1~10ms 有压力
10~50ms 队列堆积
>50ms 调度爆炸
2️⃣ perf sched timehist(找“唤醒源”)
perf sched timehist
你要重点看:
comm / pid / wakeups
判断:
wakeups 高 + runtime 碎片化
= 频繁唤醒(wakeup storm)
3️⃣ perf record(找“函数根因”)
Step 1:锁定进程
perf record -F 99 -g -p <PID>
Step 2:生成火焰图
perf script | stackcollapse-perf.pl | flamegraph.pl
看什么:
tokio::runtime
mpsc
spawn
epoll_wait
futex
四、第四阶段:bcc(只做“补充验证”)
👉 bcc 不做主分析,只做“补刀确认”
1️⃣ runqlat(队列长度验证)
runqlat
2️⃣ wakeup(谁唤醒谁)
wakeup
3️⃣ tcplife(网络来源)
tcplife
4️⃣ tcpconnect(连接风暴)
tcpconnect
五、第五阶段:结果验证(ps / pidstat)
👉 这一步你说得完全正确:只能最后做
1️⃣ pidstat(线程级确认)
pidstat -t -p <PID> 1
看:
-
哪些 TID 抖
-
CPU 是否集中/分散
2️⃣ ps(确认归属)
ps -eLo pid,tid,cmd | grep <process>
六、完整标准链路(必须严格执行)
vmstat↓
top↓
perf sched record↓
perf sched latency ← 队列长度↓
perf sched timehist ← 唤醒来源↓
perf record ← 函数根因↓
bcc (runqlat/wakeup) ← 辅助验证↓
pidstat / ps ← 最终确认
七、你关心的3个核心问题(统一回答)
❓1. 队列长度怎么看?
👉 在 perf 里是:
perf sched latency → Avg delay / Max delay
👉 在 vmstat:
r = runqueue长度(系统级)
❓2. 是否频繁唤起?
👉 用:
perf sched timehist → wakeups
❓3. tokio-runtime-w 分散 TID 是什么?
👉 结论:
不是多个问题
是同一线程池被 scheduler 打散执行
八、关键原则(避免你走偏)
❌ 不要做:
-
只看 perf top(没用)
-
只看 TID(误导)
-
只看 CPU(错因)
✔️ 必须做:
-
perf sched(调度)
-
perf record(函数)
-
bcc(唤醒验证)
九、一句话总结(你这类问题本质)
perf sched 看“系统是否在排队”,
perf timehist 看“谁在唤醒谁”,
perf record 看“到底是谁在跑代码”,
ps/pidstat 只是最后确认归属。
如果你下一步愿意,我可以帮你把这一套再升级成:
👉 “tokio / vector / haproxy 专用排障模板(含典型flamegraph结构)”
可以直接做到:
-
一眼判断是 spawn / channel / IO / 网络风暴哪一种
