0


linux性能优化-CPU上下文切换

疑问:进程在竞争CPU时并没有真正运行,为什么还会导致系统的负载升高?

因为存在CPU上下文切换。

linux系统说明

  1. Linux是一个多任务操作系统,它支持远大于CPU数量的任务同时运行。当然,这些任务实际上并不是真的在同时运行,而是因为系统在很短的时间内,将CPU轮流分配给他们,造成多任务同时运行的错觉。
  2. Linux按照特权等级,把进程的运行空间分为内核空间和用户空间,分别对应着下图中, CPU特权等级的Ring0和Ring3。 (1)内核空间(Ring0): 具有最高权限,可以直接访问所有资源; (2)用户空间(Ring3): 只能访问受限资源,不能直接访问内存等硬件设备,必须通过系统调用陷入到内核中,才能访问这些特权资源; (3)Linux中,只用到Ring0和Ring3这两个特权级;在这里插入图片描述
  3. /proc是Linux的一个虚拟文件系统,用于内核空间与用户空间之间的通信。/proc/interrupts提供了一个只读的中断使用情况。

CPU上下文切换分类

根据任务的不同,CPU上下文切换可以分为几个不同的场景,进程上下文切换,线程上下文切换,中断上下文切换。

一、系统调用

  1. 在发生系统调用时,CPU寄存器里原来用户态的指令位置,需要先保存起来。接着,为了执行内核态代码,CPU寄存器需要更新为内核态指令的新位置。最后才跳转到内核态运行内核任务;
  2. 系统调用结束后,CPU寄存器需要恢复原来保存的用户态,然后再切换到用户空间,继续运行进程。所以,一次系统调用的过程,发生了两次的CPU上下文切换。
  3. 注意:系统调用过程中,并不会涉及到虚拟内存等进程用户态的资源,也不会切换进程,一直是同一个进程在运行。
  4. 系统调用过程通常称为特权模式切换,而不是上下文切换。

二、进程上下文切换

  1. 进程是由内核来管理和调度的,进程的切换只能发生在内核态。所以,进程的上下文不仅包括了虚拟内存、栈、全局变量等用户空间的资源,还包括了内核堆栈、寄存器等内核空间的状态。
  2. 进程上下文切换,在保存当前进程的内核状态和CPU寄存器之前,需要先把该进程的虚拟内存、栈等保存下来;而加载了下一进程的内核态后,还需要刷新进程的虚拟内存和用户栈。
  3. 每次上下文切换需要几十纳秒到数微妙的CPU时间。
  4. 进程切换时需要切换上下文。

进程调度触发场景

  1. 为了保证所有进程可以得到公平调度,CPU时间被划分为一段段的时间片,这些时间片再被轮流分配给各个进程。这样,当某个进程的时间片耗尽了,就会被系统挂起,切换到其它正在等待CPU的进程运行。
  2. 进程在系统资源不足(比如内存不足)时,要等到资源满足后才可以运行,这个时候进程也会被挂起,并由系统调度其他进程运行。
  3. 当进程通过睡眠函数sleep这样的方法将自己主动挂起时,自然也会重新调度。
  4. 当有优先级更高的进程运行时,为了保证高优先级进程的运行,当前进程会被挂起,由高优先级进程来运行。
  5. 发生硬件中断时,CPU上的进程会被中断挂起,转而执行内核中的中断服务程序。

三、线程上下文切换

  1. 线程是调度的基本单位,而进程是资源拥有的基本单位;内核中的任务调度,实际调度对象是线程。
  2. 当进程只有一个线程时,可以认为进程等于线程。
  3. 当进程拥有多个线程时,这些线程会共享相同的虚拟内存和全局变量等资源。这些资源在上下文切换时是不需要修改的。
  4. 线程拥有自己的私有数据,比如栈和寄存器,这些在上下文切换时是需要保存的。

线程上下文切换场景

  1. 两个线程属于不同进程,与进程上下文切换保持一致。
  2. 两个线程属于同一进程,虚拟内存共享,所以切换消耗资源更少。

四、中断上下文切换

  1. 中断处理会打断进程的正常调度和执行,转而调用中断处理程序,响应设备事件。
  2. 中断上下文切换并不涉及到进程的用户态。所以,即便中断过程打断了一个正处在用户态的进程,也不需要保存和恢复这个进程的虚拟内存,全局变量等用户态资源。

五、总结

  1. 过多的上下文切换会把CPU时间消耗在寄存器,内核栈以及虚拟内存等数据的保存和恢复上,从而缩短进程真正的运行时间,导致系统的整体性能大幅下降。
  2. 切换开销大致排名:进程上下文切换>同进程线程上下文切换>中断上下文切换/系统调用。
  3. 自愿上下文切换变多,说明进程都在等待资源,有可能发生了I/O等其他问题。
  4. 非自愿上下文切换变多,说明进程都在被强制调度,也就是都在争抢CPU,说明CPU的确成了瓶颈。
  5. 中断次数变多了,说明CPU被中断处理程序占用,还需要通过查看/proc/interrupts文件来分析具体的中断类型。

六、相关工具

  1. vmstat: 系统性能分析工具, 主要用来分析内存,也常用来分析CPU上下文切换和中断的次数。
  2. pidstat: -w参数查看上下文切换 (1)cswch: 每秒自愿上下文切换次数,指进程无法获取所需资源,导致的上下文切换。比如I/O, 内存等系统资源不足,就会发生自愿上下文切换。 (2)nvcswch: 每秒非自愿上下文切换,指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢CPU时,就容易发生非自愿上下文切换。
  3. sysbench: 多线程的基准测试工具,一般用来评估不同系统参数下的数据库负载情况。
标签: linux 性能优化

本文转载自: https://blog.csdn.net/weixin_42106049/article/details/128776307
版权归原作者 妖妖灵誓言 所有, 如有侵权,请联系我们删除。

“linux性能优化-CPU上下文切换”的评论:

还没有评论