基本概念
CPU上下文
CPU 寄存器,是 CPU 内置的容量小、但速度极快的内存。程序计数器,则是用来存储CPU正在执行的指令位置或者即将执行的下一条指令位置。它们都是CPU在运行任何任务前,必须依赖的环境。因此被叫做CPU的上下文。
CPU上下文切换
1)将前一个任务的CPU上下文保存起来;2)加载新任务的上下文;3)跳转到程序计数器所指的新位置,运行新任务。
目的:保证任务原来的状态不受影响,让任务看起来还是连续运行。
分类
进程上下文切换
触发场景:1)CPU时间片耗尽,进程被系统挂起,切换到其它正在等待CPU的进程运行;2)进程在系统资源不足时,要等到资源满足侯才可以运行,这个时候进程也会被挂起,并由系统调度其它进程运行;3)进程通过睡眠函数sleep主动将自己挂起,自然也会重新调度;4)当有优先级更高的进程运行时;5)发生硬件中断时,CPU上的进程也会被中断挂起,转而执行内核中的中断服务程序。
线程上下文切换
两种场景:1)前后两个线程属于不同进程。此时资源不共享,切换过程就跟进程上下文切换一样。2)前后两个线程属于同一个进程。此时,因为虚拟内存是共享的,所以在切换时,虚拟内存这些资源保持不动,只需要切换线程的私有数据等不共享的数据。
中断上下文切换
为了快速响应硬件的时间,中断处理会打断进程的正常调度和执行,转而调用中断处理程序,响应设备事件。
对同一个CPU来说,中断处理比进程拥有更高的优先级。
自愿与非自愿上下文切换
自愿上下文切换,是指进程无法获取所需资源,导致的上下文切换。比如IO、内存等系统资源不足。
非自愿上下文切换,则是指进程由于时间片已到等原因,被系统强制调度,进而发生的。比如说大量进程都在争抢CPU时,就非常容易发生非自愿上下文切换。
应用总结
1、CPU上下文切换是保证linux洗正常工作的核心功能之一,一般情况下我们不需要特别关注;
2、但过多的上下文切换,会把CPU事件消耗在寄存器、内核栈一级虚拟内存等数据的保存和恢复上,从而缩短进程真正运行的时间,导致系统的整体性能大幅下降。
监控
step1:查看系统总体的上下文切换情况
#vmstat 5 详细使用见vmstat命令详解
step2:查看每个进程的上下文切换情况
#pidstat -w 5 详细使用见pidstat命令详解
step3:查看每个线程的上下文切换情况
#pidstat -wt 5
step4:查看中断情况
#watch -d cat /proc/interrupts
过载经验值:这个数值取决于系统本身的CPU性能。如果系统的上下文切换次数比较稳定,那么从数百到1万以内都算正常,但是上下文切换次数超过1万次,或者切换次数出现数量级的增长时,就有可能出现了性能问题。
结果分析
1、自愿上下文切换变多,说明进程都在等待资源,有可能发生了IO问题;
2、非自愿上下文切换变多,说明进程都在被强制调用,也就是在争抢CPU,说明CPU成了瓶颈;
3、中断次数变多,说明CPU被中断处理程序占用,需要分析具体的中断类型来进一步定位。