怎么查看系统的上下文切换情况

我们知道,过多的上下文切换会将CPU的时间消耗在寄存器、内核栈i以及虚拟内存的保存和恢复上,缩短进程真正运行的时间,成了系统性能大幅下降的一个元凶。

我们可以使用vmstat这个工具来查询系统的上下文切换情况。

  1. # 每隔 5 秒输出 1 组数据
  2. $ vmstat 5
  3. procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
  4. r b swpd free buff cache si so bi bo in cs us sy id wa st
  5. 0 0 0 7005360 91564 818900 0 0 0 0 25 33 0 0 100 0 0
  • cs是每秒上下文切换的次数。
  • in则是每秒中断的次数
  • r是就绪队列的长度,也就是正在运行和等待CPU的进程数
  • b则是处于不可中断睡眠状态的进程数

可以看到这个例子中的上下文切换cs是33次,而系统中断次数是25次,而就绪队列和不可中断进程数都是0。

vmstat只给出了系统总体的上下文切换情况,要想查看每个进程的详细请情况,就需要使用我们前面提到过的pidstat了。加上-w选项,就可以查看到每个进程上下文切换的情况了。

  1. # 每隔 5 秒输出 1 组数据
  2. $ pidstat -w 5
  3. Linux 4.15.0 (ubuntu) 09/23/18 _x86_64_ (2 CPU)
  4. 08:18:26 UID PID cswch/s nvcswch/s Command
  5. 08:18:31 0 1 0.20 0.00 systemd
  6. 08:18:31 0 8 5.40 0.00 rcu_sched
  7. ...

这个结果中有两列内容是我们的重点关注对象,一个是cswch,表示每秒自愿上下文切换的次数,另一个则是nvcswch,表示每秒非自愿上下文切换的次数。

  • 所谓的自愿上下文切换,是指进程无法获取所需的资源导致的上下文切换,比如说IO,内存等系统资源不足时,就会发生自愿上下文切换、
  • 非自愿上下文切换则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢CPU时就容易发生非自愿上下文切换。

具体分析方法:

  • 自愿上下文切换变多了,说明进程都在等待资源,有可能发生了IO等其他问题
  • 非自愿上下文切换变多了,说明进程都在被强制调度,也就是都在争抢CPU,说明CPU的确成为了瓶颈
  • 中断次数变多了,说明CPU被中断程序占用,需要通过查看/proc/interrupts文件来分析具体的中断类型