如何查看CPU的上下文切换情况
vmstat 是一个常用的系统性能分析工具,主要用来分析系统的内存使用情况,也常用来分析 CPU 上下文切换和中断的次数。
vmstat示例:
[logs@NCMUATAP01 ~]$ vmstat 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 1154224 230192 181600 2660408 0 0 108 21 1 1 2 0 97 0 0
0 0 1154224 230148 181604 2660920 0 0 0 8 1475 1495 4 1 95 0 0
其中主要有以下信息需要注意:
- cs(context switch)是每秒上下文切换的次数
- in(interrupt)则是每秒中断的次数
- r(Running or Runnable)是就绪队列的长度,也就是正在运行和等待 CPU 的进程数
- b(Blocked)则是处于不可中断睡眠状态的进程数
vmstat 只给出了系统总体的上下文切换情况,而pidstat加上 -w 选项,就可以查看每个进程上下文切换的情况
[root@DMSXNAP01 ~]# pidstat -w 5
Linux 3.10.0-693.50.3.el7.x86_64 (DMSXNAP01) 02/07/2021 _x86_64_ (8 CPU)
10:44:15 AM UID PID cswch/s nvcswch/s Command
10:44:20 AM 0 3 0.20 0.00 ksoftirqd/0
10:44:20 AM 0 7 0.20 0.00 migration/0
10:44:20 AM 0 9 40.52 0.00 rcu_sched
10:44:20 AM 0 10 0.40 0.00 watchdog/0
10:44:20 AM 0 27 0.20 0.00 migration/4
输出中有两个需要关注的点:
- cswch ,表示每秒自愿上下文切换(voluntary context switches)的次数
- nvcswch ,表示每秒非自愿上下文切换(non voluntary context switches)的次数
这两个概念意味着不同的性能问题:
- 自愿上下文切换,是指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换
- 非自愿上下文切换,则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换。