当前位置: 首页 > Linux

Linux性能分析总结CPU上下文切换(二)

时间:2023-04-06 02:37:14 Linux

0x00前言我在之前的笔记中提到过,在寻找CPU性能瓶颈时,首先要查看整台机器的平均负载是否偏高,然后使用pidstat等工具以确定哪种情况导致平均负载增加。主要有三种情况:CPU密集型IO密集型场景进程数量多前两种情况我们很好理解,但是进程数量多怎么会造成CPU瓶颈呢?这是因为我们的CPU核心在执行任务的时候还是单任务的,但是执行的速度非常快,让各个进程交替执行,所以在人看来就是多个线程并行执行。但是,在不同的线程之间交替切换是非常耗费资源的。当进程数较多时,CPUContextSwitch非常频繁,会导致CPU性能瓶颈。CPUContextSwitch可以分为以下几种场景:进程上下文切换线程上下文切换中断上下文切换0x01进程上下文切换首先,Linux按照特权级别将进程运行空间分为内核态和用户态。3数字越小,权限越高。那么问题来了,由于Linux现在只使用了两个特权级,分别是Ring0内核态和Ring3用户态,所以运行在不同特权级上的进程上下文切换主要有两种:用户态进程之间是什么用户态进程落入内核态进程和用户态空间切换的区别?不同的是,当用户态进行系统调用时,会发生两次CPU上下文切换,即:用户态进程调用系统调用,落入内核态。内核进程执行调用,然后恢复原始用户状态。在进程执行方面,当系统调用时,当前用户态进程不会切换到其他用户态进程,只是进行一次系统调用(即切换到内核态)并恢复,所以我们先放着为了区分,系统调用称为特权模式切换,用户模式之间的进程切换称为上下文切换。系统调用和上下文切换有什么区别?与系统调用相比,上下文切换会节省进程的虚拟内存和堆栈,因此会消耗更多的时间。什么时候进行进程上下文切换?CPU时间片结束,CPU被分成多个时间片给不同的进程。进程运行需要的资源不够,比如等待IO,Memory不足等进程主动挂掉,比如sleep函数有更高优先级的进程执行,比如硬中断0x02线程上下文切换什么的和进程的区别是什么?线程是调度的基本单位,进程是资源拥有的基本单位。也就是说,线程实际上是在做工作,是内核真正调度的对象,只是你需要工具和场地来做工作,进程为线程提供了虚拟内存和全局变量等资源。所以可以这样理解:进程=所有线程+资源如果一个进程只有一个线程,那么这个线程可以认为代表了整个进程。如果一个进程有多个线程,所有线程共享这个进程的资源。不需要切换线程,有自己的私有数据,比如stack,Register等,这些都是需要保存的。那么线程分为两种情况:前后台线程属于同一个进程,资源是共享的,所以只需要切换线程的私有数据即可。如果前后台线程Threads属于不同的进程,那么切换情况和进程是一样的。0x03中断上下文切换中断是CPU执行过程被外部事件打断。中断程序也需要执行,它会保存被中断进程的状态。这样,中断程序执行完后,原来的进程就可以继续执行了。既然要切换进程,那么自然中断也需要进行上下文切换,消耗CPU资源。但是由于中断不涉及用户态进程的切换,进程的资源不需要保存和恢复。0x04总结从上次的笔记,我说了根据CPU的增加,导致CPU使用率增加的原因有3个。这里重点说第三种情况大量进程切换,这种情况可以分为三种情况,即:进程上下文切换(进程切换是线程切换的一种特例)系统调用进程上下文切换线程在线文本切换中断上下文切换