003-cpu分析(上下文切换)

基本概念

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被中断处理程序占用,需要分析具体的中断类型来进一步定位。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。