首页/系统/Linux 内核与性能调优速查/vmstat:cs 列与 r/b 队列
CPU 与调度60 条

vmstat:cs 列与 r/b 队列

vmstat 输出中 r(运行队列)、b(不可中断任务)、in(中断)、cs(切换)四列联读,快速判断调度压力类型。

vmstat 的 cs 与队列列

vmstat 每秒输出一行采样,其中 r、b、in、cs 四列联读可以快速判断调度压力的类型:r 是等待运行的任务数(含正在运行的),b 是处于不可中断睡眠的任务数,in 是每秒中断次数,cs 是每秒上下文切换次数。它输出成本低、几乎在任何 Linux 上都能执行,适合作为登录后和告警触发时的第一手观测工具,再按线索转到 pidstat、iostat 一类的细分工具。

基本信息

命令vmstat [间隔] [次数],不带参数时输出开机以来的平均值
适用平台Linux,procps-ng 提供;部分参数在别的 Unix 上行为不同
关键列r 可运行队列、b 不可中断睡眠、in 中断、cs 上下文切换
内存相关列si/so 换页、bi/bo 块设备读写
CPU 相关列us/sy/id/wa/st 等各用途占比
典型用法先看 r 与 b 定位压力类型,再用 pidstat 找具体进程

典型使用场景

  • 登录后的第一手观测:一眼看清是 CPU 排队、I/O 阻塞还是换页导致的压力
  • 区分压测瓶颈:r 持续大于核数说明 CPU 排队,b 偏高则指向存储或网络文件系统
  • 告警上下文采集:把 vmstat 几行输出附在告警里,便于事后复盘
  • 对比调优效果:在参数变更前后用同样的间隔与次数采样,比较各列变化
  • 容器内快速判断:b 列高但 CPU 空闲时,优先排查挂载的存储性能

常用采样

常用采样
vmstat 1 5                    # 每秒一行,共 5 行
vmstat -w 1 5                 # 宽输出模式,列对齐更清晰
vmstat -s | head              # 汇总统计,累计值与事件计数
nproc                         # 核数,用于判断 r 列是否已排队
pidstat -w 1 3                # 定位造成高上下文切换的进程

关键列读法

列含义异常信号
r等待运行的任务数(含正在运行)持续大于核数说明 CPU 排队已发生
b不可中断睡眠的任务数明显大于零说明大量任务卡在存储或网络文件系统
cs每秒上下文切换次数突增时用 pidstat -w 定位具体进程
in每秒中断次数异常高可能与网卡或设备中断相关
si / so每秒换入换出内存量长期非零说明内存不足或换页频繁
第一行输出是开机以来的平均值,不代表当前状态。看瞬时情况至少跳过第一行,用 vmstat 1 这样的持续采样;用脚本采集时也应丢弃首行,否则会得到明显失真的数据。
cs 总量高不一定有问题:数万到数十万次每秒在多种正常负载下都可能出现。真正需要关注的是同一业务负载下的突变,以及是否伴随 r 队列增长、非自愿切换增加这类佐证。

易错点

  • 把第一行平均值当瞬时值:开机以来的均值会掩盖当前压力,采样必须跳过首行
  • 只看 cs 不看队列:切换次数正常但 r 队列很长,同样说明调度压力大
  • 在虚拟化环境跨机器比较 cs:宿主打断与虚拟化开销会混入统计,应建立自身历史基线
  • 把 b 列偏高当作 CPU 问题:该列指向不可中断等待,方向应转到存储与网络文件系统
  • 忙等型负载只靠 vmstat 判断:自旋类负载下 r 列可能不高但延迟已恶化,需要配合延迟指标

数据来源与参考

  • man 8 vmstat(procps-ng)
  • Linux 内核 Documentation/admin-guide/sysctl/vm.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌