监控进程线程切换频率需用 pidstat -w -p [pid] -t 查看各线程的 cswch/s(自愿切换)和 nvcswch/s(非自愿切换),nvcswch/s 持续 >10000 表明 cpu 饱和或锁竞争,cswch/s 高则提示 i/o 或资源等待。

要监控进程运行中的线程切换频率,核心是用 pidstat -w 结合 -t 和 -p 参数,重点关注 cswch/s(自愿切换)和 nvcswch/s(非自愿切换)这两项指标。
确认目标进程 PID
先查出你要监控的进程 ID:
- 用
ps aux | grep [关键词]或pgrep -f [命令名]找到进程 PID - 例如:Java 应用常用
pgrep -f "java.*app.jar"
查看进程级上下文切换总量
执行以下命令,观察整体切换趋势:
-
pidstat -w -p [PID] 1 5—— 每秒采样一次,共 5 次 - 输出中关注
cswch/s(自愿)和nvcswch/s(非自愿)两列 - 若
nvcswch/s明显偏高(如持续 > 10000),说明线程在争抢 CPU 时间片,CPU 很可能已饱和
深入到线程粒度定位热点线程
加上 -t 参数,看到每个线程(TID)的切换行为:
pidstat -w -p [PID] -t 1 5- 输出中每行对应一个线程,
TID列即线程 ID,Command列会显示线程名(如pool-1-thread-1或java) - 重点排查
nvcswch/s高的线程:可能是计算密集型任务或锁竞争激烈 - 若
cswch/s高而nvcswch/s低,说明线程常因 I/O、锁、内存缺页等主动让出 CPU,需结合pidstat -r或-d进一步查资源等待
辅助判断是否异常
单次采样值参考意义有限,更要看趋势和对比:
- 稳定业务下,每秒几百到几千次切换属常见范围;突增至数万或数量级增长需警惕
- 同一进程内,某几个线程的
nvcswch/s远高于其他线程,大概率是瓶颈所在 - 可配合
perf top -p [PID]或cat /proc/[PID]/stack查看高切换线程正在执行的函数栈











