LinuxCPU上下文切换的故障排查

混说Linux 2022-11-16 11:32

点击左上方蓝色“混说Linux”,选择“设为星标

第一时间看干货文章



 1

CPU 上下文切换是保证 Linux 系统正常运行的核心功能。可分为进程上下文切换线程上下文切换中断上下文切换

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

 

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

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

vmstat

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

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

让我们看一下输出:

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

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

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

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

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

pidstat

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

例如:

# Output interval is 5
$ pidstat -w 5
Linux 4.15.0 (ubuntu)  09/23/18  _x86_64_  (2 CPU)
08:18:26      UID       PID   cswch/s nvcswch/s  Command
08:18:31        0         1      0.20      0.00  systemd
08:18:31        0         8      5.40      0.00  rcu_sched
...

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

# 1 means output interval is 1 second
# -w: output process switching index,
# -u: output CPU usage index
$ pidstat -w -u 1
08:06:33      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
08:06:34        0     10488   30.00  100.00    0.00    0.00  100.00     0  sysbench
08:06:34        0     26326    0.00    1.00    0.00    0.00    1.00     0  kworker/u4:2
08:06:33      UID       PID   cswch/s nvcswch/s  Command
08:06:34        0         8     11.00      0.00  rcu_sched
08:06:34        0        16      1.00      0.00  ksoftirqd/1
08:06:34        0       471      1.00      0.00  hv_balloon
08:06:34        0      1230      1.00      0.00  iscsid
08:06:34        0      4089      1.00      0.00  kworker/1:5
08:06:34        0      4333      1.00      0.00  kworker/0:3
08:06:34        0     10499      1.00    224.00  pidstat
08:06:34        0     26326    236.00      0.00  kworker/u4:2
08:06:34     1000     26784    223.00      0.00  sshd

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

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

中断

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

# -d: Highlight the change area
$ watch -d cat /proc/interrupts
           CPU0       CPU1
...
RES:    2450431    5279697   Rescheduling interrupts
...

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

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

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

 

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

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

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

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

本文系网络素材整理,版权归原作者所有,如有侵权,请联系删除。




往期推荐

手把手教你写一个 Makefile 文件

一文读懂 | Linux共享内存原理

嵌入式必懂的 CAN 总线,真的讲到位了!!

一种简易的嵌入式设备系统日志记录方法

来都来了,点个在看再走吧~~~



混说Linux 百度研发工程师,分享Linux干货,和大家一起学习!
评论
  • 数字隔离芯片是一种实现电气隔离功能的集成电路,在工业自动化、汽车电子、光伏储能与电力通信等领域的电气系统中发挥着至关重要的作用。其不仅可令高、低压系统之间相互独立,提高低压系统的抗干扰能力,同时还可确保高、低压系统之间的安全交互,使系统稳定工作,并避免操作者遭受来自高压系统的电击伤害。典型数字隔离芯片的简化原理图值得一提的是,数字隔离芯片历经多年发展,其应用范围已十分广泛,凡涉及到在高、低压系统之间进行信号传输的场景中基本都需要应用到此种芯片。那么,电气工程师在进行电路设计时到底该如何评估选择一
    华普微HOPERF 2025-01-20 16:50 73浏览
  • 临近春节,各方社交及应酬也变得多起来了,甚至一月份就排满了各式约见。有的是关系好的专业朋友的周末“恳谈会”,基本是关于2025年经济预判的话题,以及如何稳定工作等话题;但更多的预约是来自几个客户老板及副总裁们的见面,他们为今年的经济预判与企业发展焦虑而来。在聊天过程中,我发现今年的聊天有个很有意思的“点”,挺多人尤其关心我到底是怎么成长成现在的多领域风格的,还能掌握一些经济趋势的分析能力,到底学过哪些专业、在企业管过哪些具体事情?单单就这个一个月内,我就重复了数次“为什么”,再辅以我上次写的:《
    牛言喵语 2025-01-22 17:10 41浏览
  • 2024年是很平淡的一年,能保住饭碗就是万幸了,公司业绩不好,跳槽又不敢跳,还有一个原因就是老板对我们这些员工还是很好的,碍于人情也不能在公司困难时去雪上加霜。在工作其间遇到的大问题没有,小问题还是有不少,这里就举一两个来说一下。第一个就是,先看下下面的这个封装,你能猜出它的引脚间距是多少吗?这种排线座比较常规的是0.6mm间距(即排线是0.3mm间距)的,而这个规格也是我们用得最多的,所以我们按惯性思维来看的话,就会认为这个座子就是0.6mm间距的,这样往往就不会去细看规格书了,所以这次的运气
    wuliangu 2025-01-21 00:15 183浏览
  •     IPC-2581是基于ODB++标准、结合PCB行业特点而指定的PCB加工文件规范。    IPC-2581旨在替代CAM350格式,成为PCB加工行业的新的工业规范。    有一些免费软件,可以查看(不可修改)IPC-2581数据文件。这些软件典型用途是工艺校核。    1. Vu2581        出品:Downstream     
    电子知识打边炉 2025-01-22 11:12 49浏览
  • 嘿,咱来聊聊RISC-V MCU技术哈。 这RISC-V MCU技术呢,简单来说就是基于一个叫RISC-V的指令集架构做出的微控制器技术。RISC-V这个啊,2010年的时候,是加州大学伯克利分校的研究团队弄出来的,目的就是想搞个新的、开放的指令集架构,能跟上现代计算的需要。到了2015年,专门成立了个RISC-V基金会,让这个架构更标准,也更好地推广开了。这几年啊,这个RISC-V的生态系统发展得可快了,好多公司和机构都加入了RISC-V International,还推出了不少RISC-V
    丙丁先生 2025-01-21 12:10 111浏览
  • 本文介绍瑞芯微开发板/主板Android配置APK默认开启性能模式方法,开启性能模式后,APK的CPU使用优先级会有所提高。触觉智能RK3562开发板演示,搭载4核A53处理器,主频高达2.0GHz;内置独立1Tops算力NPU,可应用于物联网网关、平板电脑、智能家居、教育电子、工业显示与控制等行业。源码修改修改源码根目录下文件device/rockchip/rk3562/package_performance.xml并添加以下内容,注意"+"号为添加内容,"com.tencent.mm"为AP
    Industio_触觉智能 2025-01-17 14:09 164浏览
  • Ubuntu20.04默认情况下为root账号自动登录,本文介绍如何取消root账号自动登录,改为通过输入账号密码登录,使用触觉智能EVB3568鸿蒙开发板演示,搭载瑞芯微RK3568,四核A55处理器,主频2.0Ghz,1T算力NPU;支持OpenHarmony5.0及Linux、Android等操作系统,接口丰富,开发评估快人一步!添加新账号1、使用adduser命令来添加新用户,用户名以industio为例,系统会提示设置密码以及其他信息,您可以根据需要填写或跳过,命令如下:root@id
    Industio_触觉智能 2025-01-17 14:14 121浏览
  •  光伏及击穿,都可视之为 复合的逆过程,但是,复合、光伏与击穿,不单是进程的方向相反,偏置状态也不一样,复合的工况,是正偏,光伏是零偏,击穿与漂移则是反偏,光伏的能源是外来的,而击穿消耗的是结区自身和电源的能量,漂移的载流子是 客席载流子,须借外延层才能引入,客席载流子 不受反偏PN结的空乏区阻碍,能漂不能漂,只取决于反偏PN结是否处于外延层的「射程」范围,而穿通的成因,则是因耗尽层的过度扩张,致使跟 端子、外延层或其他空乏区 碰触,当耗尽层融通,耐压 (反向阻断能力) 即告彻底丧失,
    MrCU204 2025-01-17 11:30 182浏览
  •  万万没想到!科幻电影中的人形机器人,正在一步步走进我们人类的日常生活中来了。1月17日,乐聚将第100台全尺寸人形机器人交付北汽越野车,再次吹响了人形机器人疯狂进厂打工的号角。无独有尔,银河通用机器人作为一家成立不到两年时间的创业公司,在短短一年多时间内推出革命性的第一代产品Galbot G1,这是一款轮式、双臂、身体可折叠的人形机器人,得到了美团战投、经纬创投、IDG资本等众多投资方的认可。作为一家成立仅仅只有两年多时间的企业,智元机器人也把机器人从梦想带进了现实。2024年8月1
    刘旷 2025-01-21 11:15 390浏览
  • 现在为止,我们已经完成了Purple Pi OH主板的串口调试和部分配件的连接,接下来,让我们趁热打铁,完成剩余配件的连接!注:配件连接前请断开主板所有供电,避免敏感电路损坏!1.1 耳机接口主板有一路OTMP 标准四节耳机座J6,具备进行音频输出及录音功能,接入耳机后声音将优先从耳机输出,如下图所示:1.21.2 相机接口MIPI CSI 接口如上图所示,支持OV5648 和OV8858 摄像头模组。接入摄像头模组后,使用系统相机软件打开相机拍照和录像,如下图所示:1.3 以太网接口主板有一路
    Industio_触觉智能 2025-01-20 11:04 150浏览
  • 高速先生成员--黄刚这不马上就要过年了嘛,高速先生就不打算给大家上难度了,整一篇简单但很实用的文章给大伙瞧瞧好了。相信这个标题一出来,尤其对于PCB设计工程师来说,心就立马凉了半截。他们辛辛苦苦进行PCB的过孔设计,高速先生居然说设计多大的过孔他们不关心!另外估计这时候就跳出很多“挑刺”的粉丝了哈,因为翻看很多以往的文章,高速先生都表达了过孔孔径对高速性能的影响是很大的哦!咋滴,今天居然说孔径不关心了?别,别急哈,听高速先生在这篇文章中娓娓道来。首先还是要对各位设计工程师的设计表示肯定,毕竟像我
    一博科技 2025-01-21 16:17 100浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦