聊聊Linux中CPU上下文切换( 四 )


对同一个 CPU 来说,中断处理比进程拥有更高的优先级,所以中断上下文切换不会与进程上下文切换同时发生 。并且,由于中断会打断正常进程的调度和执行,所以大部分中断处理程序都短小精悍,以便可以尽快完成 。
上下文切换的消耗保存上下文恢复上下文的过程并不是免费的,需要内核在 CPU 上运行才能完成 。据测试,每次上下文切换都需要几十纳秒到数微妙的 CPU 时间 。特别是在进程上下文切换次数较多的情况下,很容易导致 CPU 将大量时间消耗在寄存器、内核栈、虚拟内存等资源的保存和恢复上,从而大大缩短了真正运行进程的时间 。
Linux相比与其他操作系统(包括其他类 Unix 系统)有很多的优点,其中有一项就是,其上下文切换和模式切换的时间消耗非常少 。Linux 通过 TLB 来管理虚拟内存到物理内存的映射关系 。当虚拟内存更新后,TLB 也需要刷新,内存的访问也会随之变慢 。特别是多处理器系统上,缓存是被多个处理器共享的,刷新缓存不仅会影响当前处理器的进程,还会影响共享缓存的其它处理器的进程 。所以过多的上下文切换对系统来说意味着会消耗大量的 CPU 时间 。
根据Tsuna的测试报告,每次上下文切换都需要几十纳秒到数微妙的CPU时间,这个时间还是相当可观的 。不管是哪种场景导致的上下文切换,你都应该知道:

  1. CPU上下文切换,是保证Linux系统正常工作的核心功能,一般情况下不需要开发人员特别关注 。
  2. 但过多的上下文切换,会把CPU时间消耗在寄存器、内核栈以及虚拟内存等数据的保存和恢复上,从而缩短进程真正运行的时间,耗费大量的 CPU,甚至严重降低系统的整体性能 。
补充:vmstat命令查看整体CPU上下文切换情况上面已经介绍到CPU上下文切换分为进程上下文切换、线程上下文切换、中断上下文切换,那么过多的上下文切换会把CPU的时间消耗在寄存器、内核栈以及虚拟内存等数据的保存和恢复上,缩短进程真正运行的时间,成为系统性能大幅下降的一个因素所以我们可以使用vmstat这个工具来查询系统的上下文切换情况,vmstat是一个常用的系统性能分析工具,可以用来分析CPU上下文切换和中断的次数执行如下的命令:vmstat 5 (每隔5s输出一组数据)
聊聊Linux中CPU上下文切换

文章插图
该命令输出信息中,各个字段以及含义:procs:procs 中有 r 和 b 列,它报告进程统计信息 。在上面的输出中,在运行队列(r)中有两个进程在等待 CPU 并有零个休眠进程(b) 。通常,它不应该超过处理器(或核心)的数量,如果你发现异常,最好使用 top 命令进一步地排除故障 。
  • r:等待运行的进程数 。
  • b:休眠状态下的进程数 。
memory: memory 下有报告内存统计的 swpd、free、buff 和 cache 列 。你可以用 free -m 命令看到同样的信息 。在上面的内存统计中,统计数据以千字节表示,这有点难以理解,最好添加 M 参数来看到以兆字节为单位的统计数据 。
  • swpd:使用的虚拟内存量 。
  • free:空闲内存量 。
  • buff:用作缓冲区的内存量 。
  • cache:用作高速缓存的内存量 。
  • inact:非活动内存的数量 。
  • active:活动内存量 。
swap:swap 有 si 和 so 列,用于报告交换内存统计信息 。你可以用 free -m 命令看到相同的信息 。

经验总结扩展阅读