关注+星标公众号,不错过精彩内容
译者 | 子沐爱扫地
vmstat
工具来查询你系统的上下文切换。vmstat
是一种常用的系统性能分析工具。主要用于分析内存使用情况,也常用于分析 CPU 上下文切换和中断的次数。vmstat 5
(5 秒输出间隔):cs
(context switch):每秒上下文切换的次数。in
(interrupt):每秒的中断数。r
(running | runnable):就绪队列的长度,即正在运行和等待 CPU 的进程数。b
(blocked):处于不间断睡眠状态的进程数。33
次,系统中断次数为 25
次,就绪队列长度,不间断状态进程数均为 0
。vmstat
工具只给出了系统的整体上下文切换的信息。要查看每个进程的详细信息,您需要使用 pidstat
。添加 -w
选项,您可以看到每个进程的上下文切换:# Output interval is 5
$ pidstat -w 5
Linux 4.15.0 (ubuntu) 09/23/18 _x86_64_ (2 CPU)
08:18:26 UID PID cswch/s nvcswch/s Command
08:18:31 0 1 0.20 0.00 systemd
08:18:31 0 8 5.40 0.00 rcu_sched
...
cswch
和 nvcswch
。其中,cswch
表示每秒自愿上下文切换的次数,nvcswch
表示每秒非自愿上下文切换的次数。sysbench
(https://github.com/akopytov/sysbenc),一个多线程的基准测试工具通过生成负载来模拟上下文切换过多的问题。假设您已经在 Linux 系统上安装了 sysbench
和 sysstat
。vmstat
:cs
是 35
,中断次数 in
是 19
,r
和 b
都是 0
。由于我目前没有其他任务在运行,因此它们是空闲系统中的上下文切换数量。sysbench
来模拟多线程调度系统的瓶颈:$ sysbench --threads=10 --max-time=300 threads run
vmstat
输出了与上面不同的结果:cs
栏的上下文切换次数从之前的 35
次突增到 139
万次。同时,注意观察其他几个指标:r
:就绪队列的长度已达到 8
us
和 sy
:us
和 sy
的 CPU 使用率加起来是 100%
,系统 CPU 使用率是 84%
,说明 CPU 主要被内核占用。in
:中断数也上升到了 10000
,说明中断处理也是一个潜在的问题。pidstat
,看看 CPU 和进程上下文切换的情况:# 1 means output interval is 1 second
# -w: output process switching index,
# -u: output CPU usage index
$ pidstat -w -u 1
08:06:33 UID PID %usr %system %guest %wait %CPU CPU Command
08:06:34 0 10488 30.00 100.00 0.00 0.00 100.00 0 sysbench
08:06:34 0 26326 0.00 1.00 0.00 0.00 1.00 0 kworker/u4:2
08:06:33 UID PID cswch/s nvcswch/s Command
08:06:34 0 8 11.00 0.00 rcu_sched
08:06:34 0 16 1.00 0.00 ksoftirqd/1
08:06:34 0 471 1.00 0.00 hv_balloon
08:06:34 0 1230 1.00 0.00 iscsid
08:06:34 0 4089 1.00 0.00 kworker/1:5
08:06:34 0 4333 1.00 0.00 kworker/0:3
08:06:34 0 10499 1.00 224.00 pidstat
08:06:34 0 26326 236.00 0.00 kworker/u4:2
08:06:34 1000 26784 223.00 0.00 sshd
pidstat
的输出可以发现,CPU 使用率的增加确实是 sysbench
造成的,它的 CPU 使用率已经达到了 100%
。但上下文切换来自其他进程,包括非自愿上下文切换频率最高的 pidstat
,以及自愿上下文切换频率最高的内核线程 kworker
和 sshd
。注意:默认情况下 pidstat
只显示进程的上下文切换,如果要查看实际线程的上下文切换,请添加-t
选项。
/proc/interrupts
文件。该文件会提供一个只读的中断使用情况。# -d: Highlight the change area
$ watch -d cat /proc/interrupts
CPU0 CPU1
...
RES: 2450431 5279697 Rescheduling interrupts
...
10000
,或者切换次数快速增加时,很可能是出现了性能问题。/proc/interrupts
文件来分析具体的中断类型。