Linux性能分析-CPU上下文切换
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux性能分析-CPU上下文切换相关的知识,希望对你有一定的参考价值。
参考技术A在 Linux性能分析-平均负载 中,提到过一种导致平均负载升高的情况,就是有大量进程或线程等待cpu调度。
为什么大量进程或者线程等待CPU调度会导致负载升高呢?
当大量进程或者线程等待调度时,cpu需要更加频繁的切换任务,在切换任务的过程中,需要保存上一个任务的context到内核中,并且恢复当前任务的context,这种保存和恢复的操作也是需要cpu来执行的,导致cpu都消耗在了 保存上文和恢复下文 这个过程中。
除了进程和线程导致的上下文切换以外,硬件产生的中断事件也会导致上下文切换。并且中断事件的优先级是高于线程和进程任务的。
这篇文章会模拟测试这种情况。
vmstat是一个观测总体上下文切换状况的命令。
下面指令可以每隔5秒输出一组数据。
重点关注列含义:
使用vmstat关注到了整体的情况,接下来可以使用pidstat关注具体线程的情况
注:pidstat -wt 可以输出线程的情况
重点关注列含义:
系统环境:
首先安装sysbench,使用sysbench,我们可以模拟一个进程内多线程调度引起的上下文切换问题。
安装好后,执行下面命令
查看下vmstat和pidstat
观察vmstat结果,可以看到
观察pidstat两类结果,可以发现
整体结果符合我们的预期。
针对in列显著提高,可以查看 /proc/interrupts 文件,里面记录了中断相关的数据,这些数据记录的是从上次启动到现在的累加值。
我们把系统重新启动下,看下空闲状态下的文件
当执行sysbench命令后,并运行一段时间后,该文件如下
其中,LOC和RES显著升高
RES表示,唤醒空闲状态的CPU来调度新的任务运行,和我们模拟的过多任务调度有关。
LOC不太理解,暂时先放在这里。
Linux性能学习(1.3):CPU_CPU上下文切换
文章目录
参考资料:
1.
https://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html
1 简介
在Linux下,如果我们使用ps指令可以看到有很多进程在同时运行,但是实际上并不是同一时刻运行的,单核CPU在某一时刻只会运行一个任务,而系统则会通过调度算法(时间片轮转、中断优先、高优先级优先等算法)将不同的任务给到CPU运行,从而造成可以同时执行很多进程的假象。
在系统将某一个任务给到CPU运行时候,CPU则需要将当前正在执行的指令进行存储,以便下次执行这个任务,以及需要知道下一个任务的指令的位置,以便加载进来运行,而程序计数器则是用于存放指令所在地址的地方;寄存器是加载速度比缓存更快的内存,用于存储CPU需要的参与运算的数据和运算结果;上面的程序计数器和寄存器组合起来就是一个任务的上下文,即CPU的上下文。
PS:程序计数器也是属于CPU寄存器中的一类。
上下文切换则是指CPU在运行新任务前,将当前任务的数据以及指令等信息保存起来,即这个任务的上下文保存起来到系统内核中,然后加载新任务的上下文数据到程序计数器和寄存器中,然后跳转到程序计数器指定的新位置,开始运行任务。
CPU保存旧任务的上下文,以及加载新任务的上下文,即上下文切换是需要时间的,所以频繁的上下文切换也会导致CPU耗费时间在数据保存以及数据读取上。
根据任务的不同,上下文切换分为进程上下文切换、线程上下文切换以及中断上下文切换。
2 进程上下文切换
在以下场景中,会触发进程上下文切换:
进程正常执行完毕;
进程分配的CPU时间片使用完了,需要调度另外的任务;
使用sleep等休眠函数,则会被挂起;
系统资源不足时,进程被挂起,要等待系统资源满足,进程则再次运行;
高优先级的进程需要运行;
硬件中断发送,优先级最高,需要运行。
3 线程上下文切换
线程是系统调度的基本单位,进程是资源拥有的基本单位,为线程提供虚拟内存,全局变量等资源。
如果一个进程只有一个线程,那么这个进程就相当于线程;如果一个进程有多个线程,那么这些线程就会共享这个进程的虚拟内存、全局变量等资源,这些资源因为是共享的,如果发生进程内的线程切换,则不会切换这些资源,但是线程也会有自己一些数据,发生进程内的线程切换,这些数据是需要保存和切换的。
因此,如果发生切换的线程如果属于不同的进程,则上下文切换相当于进程的上下文切换;如果发生切换的线程如果属于相同的进程,共享资源不切换,值切换线程独有的数据。
4 中断上下文切换
硬件中断的优先级高于普通进程的优先级,因此当硬件中断发生,CPU会优先执行中断事件,从而发生中断上下文切换。
中断上下文切换不涉及到进程的用户态,因此不需要保存和恢复用户态资源(虚拟内存、全局变量等资源),而是涉及到内核态。因此性能消耗上会比进程上下文切换低。
以上是关于Linux性能分析-CPU上下文切换的主要内容,如果未能解决你的问题,请参考以下文章
Linux性能学习(1.4):CPU_如何查看CPU上下文切换参数