线上系统变慢,刚入行的程序员们往往会束手无策,这个时候还得高工出马。本系列打算从CPU、内存、I/O、网络4方面系统梳理如何高效定位和分析系统瓶颈的方法,带你一步步成为组中那个技术大佬!
本篇从CPU性能分析入手,将必备要懂的理论名词和常用的CPU性能分析工具一网打尽,助你成为性能分析大佬。
CPU理论名词篇
1. CPU使用率
CPU使用率指单位时间内CPU使用情况的统计,除了空闲时间外的其他时间占总 CPU 时间的百分比,具体的计算方法为:
2. 平均负载
平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数。具体来说,可运行状态的进程,是指正在使用 CPU 或者正在等待 CPU 的进程。不可中断状态的进程,是指正处于内核态关键流程中的进程,如等待硬件设备的 I/O 响应等,这些进程是不可中断的。
倪朋飞.《Linux 性能优化实战》
我知道,初次见到平均负载这个含义的同学可能会觉得拗口。简单来说,你可以把这里的『负载』理解成『活跃进程数』,如果平均负载是2,那平均活跃进程数也是2。
如果你的系统有2个CPU,那么恭喜你,你的每个CPU都恰好有一个进程,说明你的CPU得到了充分利用。
如果你的系统只有1个CPU,说明你的CPU要开始卷了,因为同一个时刻,会有一个进程竞争不到CPU。
如果你的系统有4个CPU,说明你的CPU已开启躺平模式,其中2个CPU已在闲适舒服中~
3. CPU上下文切换
我们知道操作系统是一个多任务操作系统,能够支持多个任务"同时"运行。这主要是因为CPU能够分时轮换处理多个任务,在同一个时刻,只能有一个任务正在运行。故所谓的CPU上下文切换指的是先把前一个任务的上下文(CPU寄存器和程序计数器)保存到系统内核中,然后基于系统任务调度加载新任务的上下文到这些寄存器和程序计数器,并根据程序计数器所指的位置来运行新任务。
那么CPU的上下文切换主要发生在什么时候呢?
3.1 系统调用
如图所示,用户空间在Ring3,是用户程序的运行空间;内核空间是Ring0,是Linux内核的运行空间。
从用户空间到内核空间的转变,需要系统调用来完成,如打开关闭文件、读写文件等,一次系统调用需要两次CPU上下文切换。
(1)进程的用户空间-> 进程的内核空间
(2)进程的内核空间-> 进程的用户空间
3.2 进程的上下文切换
进程是通过内核来管理和调度的,进程的切换只能发生在内核态,故进程的上下文切换比系统调用多了一步。
(1)进程1的用户空间-> 进程1的内核空间
(2)进程1的内核空间-> 进程2的内核空间
(2)进程2的内核空间-> 进程2的用户空间
3.3 线程上下文切换
从一个线程切换到另一个线程需要线程上下文切换。
(1)若前后两个线程属于同一个进程,因为进程内虚拟内存、全局变量等资源共享,故切换时只需保存各自的私有数据。
(2)若前后两个线程属于不同的进程,因为资源不共享,故线程的上下文切换和进程的上下文切换是一样的。
3.4 中断上下文切换
当有硬件中断时,中断处理会打断进程的正常调度和执行,会将进程内核态的上下文保存下来,转而执行中断,这样在中断完成后,进程仍能恢复原来的状态继续运行。
CPU上下文切换是操作系统的基础功能,不需要特别关注,但是过多的上下文切换会让CPU的时间过多消耗在寄存器、堆栈、虚拟内存等数据的保存和恢复上,缩短进程的真正运行时间,导致系统整体性能的下降。