nvcswch
你说得对,这个点之前确实没讲清楚:nvcswch到底怎么“用来定位问题”,而不是只说它是锁指标。
我给你一张真正能落地排障的完整表(重点补 nvcswch 的“定位路径”),按你要求:vmstat + ps + perf 一体化。
✔ ✔ 生产级完整定位表(重点强化 nvcswch)
| 场景 | vmstat现象 | nvcswch表现 | ps怎么定位 | perf怎么定位 | 根因 |
|---|---|---|---|---|---|
| CPU排队 | r ↑↑ | 低 | ps -eo pid,%cpu --sort=-%cpu |
perf top |
CPU算力不足 |
| CPU热点 | r ↑ / cs 正常 | 低 | ps -p PID -L -o tid,%cpu |
perf top(函数热点) |
单函数耗CPU |
| 调度风暴 | cs ↑↑↑ | 中等 | `ps -eLf | wc -l`(线程爆炸) | perf sched latency |
| ⭐ 锁竞争(核心) | cs ↑↑ / r ↑ | 🔥 nvcswch >> cswch | ps -T -p PID -o tid,state,comm(找阻塞线程) |
perf lock report / perf top |
mutex / futex / synchronized |
| IO阻塞 | wa ↑↑ / b ↑ | 低 | `ps -eo pid,state | grep D` | perf record -e block:* |
| 网络风暴 | in ↑↑ / cs ↑ | 中 | `ps -eo pid,%cpu | sort` | perf top (softirq) |
| 线程池爆炸 | r ↑↑ / cs ↑ | 中 | `ps -eLf | awk '{print $2}'`统计线程数 | perf sched latency |
| JVM锁问题 | cs ↑ / CPU不满 | 🔥 nvcswch 极高 | `ps -p PID -o cmd | grep java` | perf lock record |
| CPU假忙 | cs ↑↑ / CPU不满 | 中 | ps -eLf(大量短线程) |
perf sched timehist |
频繁唤醒 |
✔ ✔ nvcswch到底“怎么看问题”(核心补充)
✔ 一、它的真实含义(关键)
nvcswch = involuntary context switch(被动切换)
👉 不是“主动让CPU”,而是:
线程被系统强制换下去(最常见原因:锁 / 调度阻塞)
✔ 二、nvcswch 不是单独看的,是“对比看的”
✔ 关键判断公式(非常重要)
nvcswch >> cswch → 锁问题
nvcswch ≈ cswch → 正常调度
cswch >> nvcswch → IO/正常让出CPU
✔ 三、nvcswch 如何“定位到具体进程”
✔ Step 1:找谁在产生 nvcswch
ps -eLo pid,tid,cmd,nlwp,pcpu --sort=-pcpu | head
✔ Step 2:看线程状态(关键)
ps -T -p <pid> -o tid,stat,comm
重点看:
| 状态 | 含义 |
|---|---|
| S | sleep(可能等锁) |
| D | IO阻塞 |
| R | running |
✔ Step 3:确认是不是锁
如果你看到:
大量 S 状态线程 + CPU不高 + cs很高
👉 高概率:
✔ 锁竞争(nvcswch来源)
✔ 四、nvcswch 在 perf 里怎么看(关键)
perf lock report
你会看到:
| 关键函数 | 含义 |
|---|---|
| futex_wait_queue_me | 用户态锁 |
| pthread_mutex_lock | mutex |
| __lll_lock_wait | glibc锁 |
✔ 五、一个“最实战判断闭环”
✔ 如果同时满足:
cs > 100k/s
nvcswch/s 很高
CPU < 100%
👉 直接结论:
🔥 锁竞争(futex / mutex / synchronized)
✔ ✔ 六、把 nvcswch 放进完整决策树(最终版)
vmstat|├── r高 → CPU问题├── wa高 → IO问题├── in高 → 网络问题└── cs高|├── nvcswch高 → 🔥锁竞争├── 线程数爆炸 → 调度风暴└── CPU满 → CPU热点
✔ ✔ 最终一句话(工程级)
nvcswch 不是“一个指标”,而是“锁竞争是否成立的证据指标”,必须和 cs + CPU 一起判断。
如果你下一步想继续,我可以帮你升级成:
👉 “nvcswch → futex → 具体 Java/Go/Netty 代码级定位图(真正能落地到代码行)”
