怎么查看系统的上下文切换情况
我们知道,过多的上下文切换会将CPU的时间消耗在寄存器、内核栈i以及虚拟内存的保存和恢复上,缩短进程真正运行的时间,成了系统性能大幅下降的一个元凶。
我们可以使用vmstat这个工具来查询系统的上下文切换情况。
# 每隔 5 秒输出 1 组数据$ vmstat 5procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st0 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选项,就可以查看到每个进程上下文切换的情况了。
# 每隔 5 秒输出 1 组数据$ pidstat -w 5Linux 4.15.0 (ubuntu) 09/23/18 _x86_64_ (2 CPU)08:18:26 UID PID cswch/s nvcswch/s Command08:18:31 0 1 0.20 0.00 systemd08:18:31 0 8 5.40 0.00 rcu_sched...
这个结果中有两列内容是我们的重点关注对象,一个是cswch,表示每秒自愿上下文切换的次数,另一个则是nvcswch,表示每秒非自愿上下文切换的次数。
- 所谓的自愿上下文切换,是指进程无法获取所需的资源导致的上下文切换,比如说IO,内存等系统资源不足时,就会发生自愿上下文切换、
- 非自愿上下文切换则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢CPU时就容易发生非自愿上下文切换。
具体分析方法:
- 自愿上下文切换变多了,说明进程都在等待资源,有可能发生了IO等其他问题
- 非自愿上下文切换变多了,说明进程都在被强制调度,也就是都在争抢CPU,说明CPU的确成为了瓶颈
- 中断次数变多了,说明CPU被中断程序占用,需要通过查看/proc/interrupts文件来分析具体的中断类型
