首页/系统/Linux 内核与性能调优速查/pidstat -w 进程级切换分析
CPU 与调度60 条

pidstat -w 进程级切换分析

按进程/线程统计自愿(cswch)与非自愿(nvcswch)上下文切换,是定位「谁在疯狂切换」的直接工具。

pidstat 切换分析是什么

pidstat 属于 sysstat 工具集,加上 -w 选项后按进程或线程统计上下文切换:cswch/s 是自愿切换速率,nvcswch/s 是被抢占的非自愿切换速率。它把系统级的切换总量细化到具体进程,是回答「谁在疯狂切换」的直接工具。配合 -t 选项可以展开到线程维度,这对多线程应用尤其重要:一个进程的总量可能由其中某个线程贡献。

基本信息

命令pidstat -w [间隔] [次数],sysstat 软件包提供
关键列cswch/s 自愿切换,nvcswch/s 非自愿切换
常用选项-w 切换统计,-t 线程维度,-u 同时显示 CPU 使用率
适用平台Linux,多数发行版需单独安装 sysstat
数据来源进程与线程的累计计数差值
判读顺序先看总量异常,再按进程与线程排名定位

典型使用场景

  • 定位切换大户:系统级切换量突增时找出具体进程
  • 多线程排查:用线程维度确认是哪一个工作线程在频繁切换
  • 锁竞争分析:自愿切换偏高的进程往往存在锁等待
  • 过度并发评估:非自愿切换偏高说明线程数超出核数承载能力
  • 压测复盘:把切换曲线与吞吐、延迟曲线对齐分析

常用采样

常用采样
pidstat -w 1 3                     # 进程级切换速率
pidstat -wt 1 3 | head -40         # 线程维度,定位到具体线程
pidstat -wu 1 3                    # 同时看 CPU 使用率
pidstat -w -p 12345 1 3            # 只盯一个进程
vmstat 1 3                         # 系统级对照:cs 列与 r 队列

两列切换读法

指标含义对应根因
cswch/s自愿切换:任务主动让出 CPU等锁、等 I/O、睡眠唤醒频繁
nvcswch/s非自愿切换:被调度器抢占CPU 争抢激烈,线程数明显超过核数
两列都高等待与争抢并存需要同时优化并发模型与资源配额
数值平稳调度行为稳定切换不是当前瓶颈,转向其他指标
采样时长要覆盖问题窗口:均值会稀释短时尖峰。如果问题只在特定时段出现,应把采样安排在那个时段,或提高采样频率后筛选峰值。
看不到目标进程时先确认观察位置:在容器命名空间内采样与在宿主维度采样看到的进程集合不同,容器化环境中这一点尤其容易混淆。

易错点

  • 采样窗口太短:均值掩盖尖峰,需要用更长窗口或更高频率覆盖问题时段
  • 只看进程不看线程:多线程应用的真实热点在某个线程上,进程级数据会被平均
  • 把自愿切换高当成 CPU 不足:它多指向等锁或等 I/O,方向判断错误会浪费时间
  • 忽略采样位置:容器内外看到的进程集合不同,容易得出错误结论
  • 不做基线对比:缺少历史数据时无法判断当前数值是否异常

数据来源与参考

  • man 1 pidstat(sysstat)
  • Linux 内核 Documentation/scheduler/
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌