0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何分析Linux CPU上下文切换问题

马哥Linux运维 来源:CSDN技术社区 作者:CSDN技术社区 2022-05-05 20:11 次阅读

在我的上一篇文章:《探讨 Linux CPU 的上下文切换》中,我谈到了 CPU 上下文切换的工作原理。快速回顾一下,CPU 上下文切换是保证 Linux 系统正常运行的核心功能。可分为进程上下文切换线程上下文切换中断上下文切换

在本文中,我将进一步讨论如何分析 CPU 上下文切换问题。

检查 CPU 的上下文切换

我们知道,过多的上下文切换会消耗 CPU 的时间来保存和恢复寄存器、程序计数器、内核栈和虚拟内存等数据,从而导致系统性能显着下降。

既然上下文切换对系统性能的影响如此之大,那么我们如何检查它呢?好了,你可以使用 vmstat 工具来查询你系统的上下文切换。

vmstat

vmstat 是一种常用的系统性能分析工具。主要用于分析内存使用情况,也常用于分析 CPU 上下文切换和中断的次数。

例如 vmstat 5(5 秒输出间隔):

54b2b00a-c55d-11ec-bce3-dac502259ad0.png

让我们看一下输出:

  • cs(context switch):每秒上下文切换的次数。

  • in(interrupt):每秒的中断数。

  • r(running | runnable):就绪队列的长度,即正在运行和等待 CPU 的进程数。

  • b(blocked):处于不间断睡眠状态的进程数。

在上面的例子中,我们可以看到上下文切换次数为 33 次,系统中断次数为 25 次,就绪队列长度,不间断状态进程数均为 0

pidstat

vmstat 工具只给出了系统的整体上下文切换的信息。要查看每个进程的详细信息,您需要使用 pidstat。添加 -w 选项,您可以看到每个进程的上下文切换:

例如:

#Outputintervalis5
$pidstat-w5
Linux4.15.0(ubuntu)09/23/18_x86_64_(2CPU)
0826UIDPIDcswch/snvcswch/sCommand
0831010.200.00systemd
0831085.400.00rcu_sched
...

结果中有两列需要我们注意:cswchnvcswch。其中,cswch 表示每秒自愿上下文切换的次数,nvcswch 表示每秒非自愿上下文切换的次数。

  • 自愿上下文切换:指进程无法获得所需资源而导致的上下文切换。例如,当 I/O 和内存等系统资源不足时,就会发生自愿上下文切换。

  • 非自愿上下文切换:指进程因时间片已过期而被系统强制重新调度时发生的上下文切换。例如,当大量进程竞争 CPU 时,很容易发生非自愿的上下文切换。

您必须牢记这两个概念,因为它们意味着不同的性能问题。

案例分析

既然您知道如何查看这些指标,那么就会出现另一个问题,上下文切换频率多久才是正常的呢?让我们看一个示例案例。

我们将使用 sysbench (https://github.com/akopytov/sysbenc),一个多线程的基准测试工具通过生成负载来模拟上下文切换过多的问题。假设您已经在 Linux 系统上安装了 sysbenchsysstat

在我们模拟负载之前,让我们在一个终端中运行一下 vmstat

54cb61cc-c55d-11ec-bce3-dac502259ad0.png

在这里可以看到当前的上下文切换次数 cs35,中断次数 in19rb 都是 0。由于我目前没有其他任务在运行,因此它们是空闲系统中的上下文切换数量

现在让我们运行 sysbench 来模拟多线程调度系统的瓶颈:

$sysbench--threads=10--max-time=300threadsrun

现在,您应该会看到 vmstat 输出了与上面不同的结果:

54dbc7e2-c55d-11ec-bce3-dac502259ad0.png

应该可以发现 cs 栏的上下文切换次数从之前的 35 次突增到 139 万次。同时,注意观察其他几个指标:

  • r:就绪队列的长度已达到 8

  • ussyussy 的 CPU 使用率加起来是 100%,系统 CPU 使用率是 84%,说明 CPU 主要被内核占用。

  • in:中断数也上升到了 10000,说明中断处理也是一个潜在的问题。

结合这些指标我们可以知道系统的就绪队列太长了,也就是有太多的进程在运行等待 CPU,导致大量的上下文切换,而大量的上下文切换导致了系统 CPU 使用率的增长。

那么是什么过程导致了这些问题呢?

我们继续分析,同时在第三个终端使用 pidstat,看看 CPU 和进程上下文切换的情况:

#1meansoutputintervalis1second
#-w:outputprocessswitchingindex,
#-u:outputCPUusageindex
$pidstat-w-u1
0833UIDPID%usr%system%guest%wait%CPUCPUCommand
083401048830.00100.000.000.00100.000sysbench
08340263260.001.000.000.001.000kworker/u4:2
0833UIDPIDcswch/snvcswch/sCommand
08340811.000.00rcu_sched
08340161.000.00ksoftirqd/1
083404711.000.00hv_balloon
0834012301.000.00iscsid
0834040891.000.00kworker/1:5
0834043331.000.00kworker/0:3
08340104991.00224.00pidstat
0834026326236.000.00kworker/u4:2
0834100026784223.000.00sshd

pidstat 的输出可以发现,CPU 使用率的增加确实是 sysbench 造成的,它的 CPU 使用率已经达到了 100%。但上下文切换来自其他进程,包括非自愿上下文切换频率最高的 pidstat,以及自愿上下文切换频率最高的内核线程 kworkersshd

注意:默认情况下 pidstat 只显示进程的上下文切换,如果要查看实际线程的上下文切换,请添加 -t 选项。

中断

要找出中断数量也很高的原因所在,您可以检查 /proc/interrupts 文件。该文件会提供一个只读的中断使用情况。

#-d:Highlightthechangearea
$watch-dcat/proc/interrupts
CPU0CPU1
...
RES:24504315279697Reschedulinginterrupts
...

观察一段时间后,可以发现变化最快的是重新调度中断(RES, REScheduling interrupt)。这种中断类型表明处于空闲状态的 CPU 被唤醒以调度新的任务运行。所以这里的中断增加是因为太多的任务调度问题,这和前面上下文切换次数的分析结果是一致的

现在回到最初的问题,每秒多少次上下文切换是正常的?

这个值实际上取决于系统本身的 CPU 性能。在我看来,如果系统的上下文切换次数比较稳定的话,几百到一万应该是正常的。但是,当上下文切换次数超过 10000,或者切换次数快速增加时,很可能是出现了性能问题。

结论

此时,你应该可以根据上下文切换的类型做一些具体的分析了。

  • 自愿上下文切换较多,说明进程在等待资源,可能会出现 I/O 饱和等其他问题。

  • 非自愿上下文切换较多,说明进程正在被强制调度,也就是都在争抢 CPU,说明 CPU 确实产生了瓶颈。

  • 中断次数增多,说明 CPU 被中断处理程序占用,需要通过查看 /proc/interrupts 文件来分析具体的中断类型。

原文标题:Linux CPU 上下文切换的故障排查

文章出处:【微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10409

    浏览量

    206459
  • Linux
    +关注

    关注

    87

    文章

    10974

    浏览量

    206670

原文标题:Linux CPU 上下文切换的故障排查

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    关于进程上下文、中断上下文及原子上下文的一些概念理解

    : 进程控制块task_struct、内存管理信息(mm_struct、vm_area_struct、pgd、pte)、内核栈。 当发生进程调度时,进行进程切换就是上下文切换(context switch
    发表于 09-06 09:58

    进程上下文与中断上下文的理解

    :(1)进程上文:其是指进程由用户态切换到内核态是需要保存用户态时cpu寄存器中的值,进程状态以及堆栈上的内容,即保存当前进程的进程上下文,以便再次执行该进程时,能够恢复切换时的状态,
    发表于 12-11 19:45

    BT堆栈上下文切换

    100ms就会产生一个上下文切换上下文切换每秒似乎有点高。我想我真的不能抱怨10个开关,但是有什么东西吗?在BT协议中真的需要这个吗?不能处理中断驱动吗?(这是BT是可连接的,但既没有连接,也没有
    发表于 12-17 16:30

    多线程如何实现上下文切换

    处理系统中,CPU需要处理所有程序的操作,当用户来回切换它们时,需要记录这些程序执行到哪里。上下文切换就是这样一个过程,他允许CPU记录并恢复各种正在运行程序的状态,使它能够完成
    发表于 08-02 08:21

    上下文切换简介

    处理系统中,CPU需要处理所有程序的操作,当用户来回切换它们时,需要记录这些程序执行到哪里。上下文切换就是这样一个过程,他允许CPU记录并恢复各种正在运行程序的状态,使它能够完成
    发表于 08-06 08:08

    上下文切换的情况发生

    处理系统中,CPU需要处理所有程序的操作,当用户来回切换它们时,需要记录这些程序执行到哪里。上下文切换就是这样一个过程,他允许CPU记录并恢复各种正在运行程序的状态,使它能够完成
    发表于 08-07 08:38

    ucos上下文该怎么切换

    有两个问题请教一下大神!!!-->1在ucos中的上下文切换时发生在pendSV异常中,代码见下:PendSV_Handler CPSIDI; Prevent interruption
    发表于 08-26 03:21

    基于cortex-m3的rt-thread系统如何实现线程上下文切换

    线程上下文切换等功能,一般采用汇编格式编写,不同cpu架构实现方式肯定不同,为了使rt-thread系统能够在不同的CPU架构上都能运行,RT-thread提供了一套libcpu抽象层来适配
    发表于 05-05 15:00

    Cortex-M4在线程上下文切换中的优化

    cortex-m4相对比cortex-m3,在线程上下文切换中,主要增加了FPU寄存器,总共需要保存34个寄存器,合计136byte。因此原来在cortex-m3上面运行的程序在cortex-m4f
    发表于 08-05 10:58

    讨论ARM mbed OS(RTX) 的上下文切换

    来说,本文是一个回顾和总结,如我在《浅谈调度相关的元问题》一文所述,mbed OS 是一个支持分态的内核,其上下文切换实现的套路非常神似 linux,故而对 mbed OS 上下文切换的探讨有一定的推广
    发表于 02-16 14:26

    rt-thread上下文切换函数的意义在哪?

    Cortex-M3内核上下文切换函数rt_hw_context_switch()/ rt_hw_context_switch_interrupt()中有个判断rt_thread_switch_interrupt_flag的地方,不知道意义在哪?
    发表于 03-10 11:28

    中断中的上下文切换详解

    ();  /* 发起一次在中断中的上下文切换 */  cpu_irq_context_switch();  }  tos_knl_irq_enter接口(进入ISR时调用)将一个标识中断嵌套次数的变量
    发表于 03-23 17:18

    CPU上下文切换的详细资料讲解

    当UCOS-III转向执行另一项新任务的时候,他保存了当前任务的CPU寄存器到堆栈,并从新任务的堆栈CPU寄存器载入CPU,这个过程叫做上下文切换
    发表于 08-16 17:31 2次下载
    <b class='flag-5'>CPU</b><b class='flag-5'>上下文切换</b>的详细资料讲解

    Linux技术:什么是cpu上下文切换

    过多的上下文切换会消耗 CPU 的时间来保存和恢复寄存器、程序计数器、内核栈和虚拟内存等数据,从而导致系统性能显着下降。 既然上下文切换对系统性能的影响如此之大,那么我们如何检查它呢?好了,你可以使用 vmstat 工具来查询你
    发表于 09-01 09:31 230次阅读
    <b class='flag-5'>Linux</b>技术:什么是<b class='flag-5'>cpu</b><b class='flag-5'>上下文切换</b>

    FreeRTOS系列技术文章:上下文切换

    嵌入式实时操作系统(RTOS)中的上下文切换是指保存和恢复任务的状态,以使调度程序能够切换到另一个任务,从而促进多任务处理。
    的头像 发表于 11-21 15:48 387次阅读