当前位置: 首页 > news >正文

格排障顺序 + perf为主 + bcc辅助 + 结果验证在最后”。我给你一份标准生产级 SOP - 小镇

格排障顺序 + 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 / 网络风暴哪一种