利用 vmstat 分析 CPU 上下文切换情况
Jun 28, 2020 13:00 · 598 words · 2 minute read
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 个),大量进程正在竞争 CPUus
+sy
靠近 100%,说明 CPU 已经满载而且 2/3 被内核占用in
中断数也涨到两千多