利用 vmstat 分析 CPU 上下文切换情况

Jun 28, 2020 13:00 · 598 words · 2 minute read Linux Kernel

vmstat 是一款实时收集和报告系统内存、交换和处理器资源利用率数据的工具。

用法

$ vmstat 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 3003168   5216 409208    0    0  6868   160  812 1579 11 12 75  2  0
 0  0      0 3003036   5216 409240    0    0     3  3938  186  128  0  1 99  0  0
 0  0      0 3003152   5216 409240    0    0     0     0  102  139  0  0 99  0  0
 0  0      0 3008364   5216 409092    0    0     0     4  174  225  0  1 99  0  0
 0  0      0 3008948   5216 409092    0    0     0    12  112  145  0  0 99  0  0
  • Procs
    • r 就绪队列,正在占用和等待 CPU 的进程数量
    • b 处于不可中断睡眠的进程数量
  • Memory
    • swpd 虚拟内存的用量(被交换到磁盘上的内存大小)
    • buff 正在使用的内存大小
    • cache 已分配的内存大小,如果其他任务需要,可以被交换到磁盘或回收
  • Swap
    • si(swap in) 从 swap 上读取的内存大小
    • so(swap out) 向 swap 写入的内存大小
  • IO
    • bi(block in) 从块设备读取速度
    • bo(block out) 向块设备写入速度
  • System
    • in(interrupt) 每秒中断次数
    • cs(context switch) 每秒上下文切换次数
  • CPU
    • us 运行非内核态代码的时长
    • sy 运行内核态代码的时长

使用 sysbench 模拟系统多线程调度切换的情况:

$ sysbench --threads=10 --max-time=300 threads run

使用 vmstat 观察上下文切换情况:

$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 6  0      0 2688396   5216 716812    0    0   105    13   62 4690  1  1 99  0  0
 9  0      0 2688268   5216 716812    0    0     0     0 2574 2240489 32 67  1  0  0
 7  0      0 2688524   5216 716812    0    0     0     0 2268 2257707 33 68  0  0  0
 6  0      0 2688532   5216 716812    0    0     0     0 2406 2240404 33 66  1  0  0
 9  0      0 2688352   5216 716812    0    0     0     0 2192 2195446 33 67  0  0  0
 6  0      0 2688528   5216 716812    0    0     0     0 2378 2221355 32 68  0  0  0
 7  0      0 2688360   5216 716812    0    0     0     0 2385 2194560 32 67  1  0  0
 7  0      0 2688644   5216 716812    0    0     0     0 2247 2218747 30 70  0  0  0
  • cs 暴增到两百多万
  • r 就绪队列远超 CPU 核心数(2 个),大量进程正在竞争 CPU
  • us + sy 靠近 100%,说明 CPU 已经满载而且 2/3 被内核占用
  • in 中断数也涨到两千多