r 看排队,cs 看风暴,nvcswch 看锁,wa 看磁盘,in 看网络
下面给你一版**“锁竞争确认(无 pidstat 版本)完整对照表”**,把你前面所有判断方式统一收敛成一张生产可用的速查表。
✔ ✔ 锁竞争确认(生产级汇总表)
✔ 一、现象层(vmstat / top)
| 观测工具 | 指标 | 正常 | 异常(锁/调度风暴) |
|---|---|---|---|
| vmstat | r | ≤ CPU核数 | >> CPU核数(排队) |
| vmstat | cs | <10k/s | >100k/s(⚠️风暴) |
| vmstat | b | 0 | 0(锁问题通常不影响b) |
| vmstat | wa | <5% | 仍可能为0(锁不是IO) |
| top -H | 线程数 | <100~500 | >1000(线程风暴风险) |
| top -H | CPU分布 | 少数热点 | 多线程均摊1~5% |
✔ 二、锁竞争核心识别表(关键)
✔ ① cswch / nvcswch 模式(最重要)
| 来源工具 | 指标 | 正常 | 锁竞争特征 |
|---|---|---|---|
| pidstat | cswch/s | 中等 | 偏高 |
| pidstat | nvcswch/s | 低 | 🔥 极高 |
| 关系 | nvcswch vs cswch | nv ≤ cs | nv >> cs(锁铁证) |
✔ ✔ 锁竞争铁证条件(必须记住)
nvcswch/s >> cswch/s
+ cs 极高
+ CPU 未100%
👉 满足 = 锁竞争成立(>90%)
✔ 三、perf 层证据(最终确认)
| 工具 | 关键输出 | 含义 |
|---|---|---|
| perf top | futex_wait_queue_me | 用户态锁 |
| perf top | pthread_mutex_lock | mutex竞争 |
| perf top | __lll_lock_wait | glibc锁 |
| perf lock report | spin_lock | 内核锁 |
✔ perf 锁竞争结论表
| perf结果 | 结论 |
|---|---|
| futex_wait_queue_me 高 | Java / pthread锁 |
| spin_lock 高 | 内核锁竞争 |
| schedule 高 | 调度问题 |
| ep_poll 高 | IO/事件循环压力 |
✔ 四、vmstat 快速归因表(你当前最关键)
| 现象组合 | 结论 |
|---|---|
| r↑ + cs↑ + CPU未100% | 🔥 锁竞争 |
| r↑ + CPU100% | CPU热点 |
| b↑ + wa↑ | IO问题 |
| cs↑ + in↑ | 中断/网络问题 |
| r↑ + cs↑ + in↑ | 混合风暴(你当前) |
✔ 五、三大根因速查表(最终版)
| 类型 | vmstat特征 | top特征 | perf特征 |
|---|---|---|---|
| CPU热点 | CPU100% | 少数线程占满 | 函数热点 |
| 锁竞争 | cs↑ + r↑ | 多线程均摊CPU | futex / mutex |
| 线程风暴 | cs↑↑↑ | 线程数爆炸 | schedule / wakeup |
| IO问题 | wa↑ + b↑ | D状态进程 | block / ext4 |
| 中断风暴 | in↑ + cs↑ | CPU sys高 | softirq |
✔ 六、一句话决策规则(生产最实用)
✔ 看到 vmstat 直接这样判断:
① r 高 → CPU排队
② cs 高 → 调度/锁问题
③ wa 高 → IO问题
④ in 高 → 中断问题
✔ 锁竞争最终一句话判断:
✔ cs 很高 + nvcswch 很高 + CPU未满
= 99% 锁竞争 / futex问题
✔ 七、你当前case定位(结合你数据)
你之前 vmstat:
-
r = 70~130
-
cs = 400k+
-
CPU ≈ 90%
-
wa = 0
-
in = 400k+
✔ 最终归类:
| 类型 | 判断 |
|---|---|
| CPU热点 | ❌ 不完全匹配 |
| IO问题 | ❌ 排除 |
| 锁竞争 | ✔✔✔ 高概率 |
| 线程风暴 | ✔✔✔ 高概率 |
| 中断放大 | ✔ 叠加因素 |
✔ ✔ 最终总结(生产口诀)
r 看排队,cs 看风暴,nvcswch 看锁,wa 看磁盘,in 看网络
如果你下一步想继续,我可以帮你再升级一层:
👉 “一张图:vmstat → pidstat → perf 自动归因决策树(可贴到值班手册)”
