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 队列增长、非自愿切换增加这类佐证。