检查 CPU 的上下文切换

一.什么是cpu上下文切换

CPU 上下文切换是操作系统在多任务环境下管理进程的一项关键任务。在现代计算机系统中,有多个进程同时运行,每个进程都需要一定的 CPU 时间来执行其任务。由于 CPU 在某一时刻只能执行一个进程的指令,因此操作系统需要及时切换 CPU 的上下文,将当前运行进程的状态保存下来,并加载下一个要执行的进程的状态,从而实现进程之间的快速切换。

上下文切换的过程包含以下主要步骤:

  1. 保存当前进程的上下文: 当操作系统决定要切换到另一个进程时,首先会将当前运行进程的寄存器、程序计数器和其他必要的状态信息保存到该进程的内核栈中或进程控制块(Process Control Block,PCB)中。

  2. 选择下一个要运行的进程: 操作系统根据进程调度算法从就绪队列中选择一个新的进程来运行。这个就绪队列中保存了所有准备好被执行的进程。

  3. 恢复下一个进程的上下文: 操作系统从下一个要运行的进程的内核栈或 PCB 中恢复其先前保存的状态信息,包括寄存器、程序计数器和其他必要的信息。

  4. 切换到新进程: CPU 将控制权交给新的进程,并开始执行其指令。

这个上下文切换过程对用户是透明的,意味着用户不会察觉到进程切换的发生。操作系统负责处理上下文切换,确保系统在多个进程之间公平分配 CPU 时间,以实现多任务处理。上下文切换的频率通常取决于系统的负载和进程调度算法。

然而,上下文切换也是一项开销较高的操作,因为它涉及到 CPU 寄存器和内核栈的保存和恢复,这会导致额外的计算开销。过多的上下文切换可能会降低系统的性能,因此在优化系统性能时,减少上下文切换次数是一个重要的考虑因素 

二.使用什么工具分析上下文切换问题

vmstat:vmstat 命令用于显示系统的虚拟内存统计信息,其中包括上下文切换次数。运行 vmstat 1 命令,每秒钟显示一次系统状态,特别关注输出中的 "cs" 列,该列表示每秒钟的上下文切换次数。

pidstat:pidstat 命令用于显示指定进程的资源使用情况,包括上下文切换次数。使用 pidstat -w -p <PID> 命令,检查指定进程的上下文切换情况。注意观察 "cswch/s" 列,该列表示每秒钟的自愿(voluntary)和非自愿(non-voluntary)上下文切换次数。

perf:perf 是一个功能强大的性能分析工具,可以用于更深入地分析上下文切换的原因,如进程调度和中断等。例如,使用 perf record -e context-switches -a 命令记录上下文切换事件,然后使用 perf report 命令查看报告。

top / htop:top 和 htop 是常用的实时系统监视工具,可以显示系统负载和进程情况。在其中查看 "cs" 列,它显示每秒的上下文切换次数。

chrt:chrt 命令用于查看和修改系统的进程调度策略。使用 chrt -m 命令,查看系统的进程调度策略,确保选择合适的调度策略以减少不必要的上下文切

图片

三.使用案例讲解

1.vmstat

  • cs(context switch):每秒上下文切换的次数。
  • in(interrupt):每秒的中断数。
  • r(running | runnable):就绪队列的长度,即正在运行和等待 CPU 的进程数。
  • b(blocked):处于不间断睡眠状态的进程数。
2. pidstat

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

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

  • 自愿上下文切换:指进程无法获得所需资源而导致的上下文切换。例如,当 I/O 和内存等系统资源不足时,就会发生自愿上下文切换。
  • 非自愿上下文切换:指进程因时间片已过期而被系统强制重新调度时发生的上下文切换。例如,当大量进程竞争 CPU 时,很容易发生非自愿的上下文切换。

3.测试工具安装

yum install sysbench

 测试前查看cpu 使用情况

模拟测试:sysbench --threads=10 --max-time=300 threads run

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

  • r:就绪队列的长度已达到 8
  • us 和 syus 和 sy 的 CPU 使用率加起来是 100%,系统 CPU 使用率是 84%,说明 CPU 主要被内核占用。
  • in:中断数也上升到了 10000,说明中断处理也是一个潜在的问题。

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

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

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

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

通过pidstat -w -u 1 查看

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

四.结论

  • 自愿上下文切换较多,说明进程在等待资源,可能会出现 I/O 饱和等其他问题。
  • 非自愿上下文切换较多,说明进程正在被强制调度,也就是都在争抢 CPU,说明 CPU 确实产生了瓶颈。
  • 中断次数增多,说明 CPU 被中断处理程序占用,需要通过查看 /proc/interrupts 文件来分析具体的中断类型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/19502.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL内置函数使用说明

MySQL函数使用说明 MySQL 是一个流行的关系型数据库管理系统&#xff0c;它提供了许多内置函数来处理和操作数据。这些函数可以简化数据库查询和操作的过程&#xff0c;提高代码的可读性和效率。以下是一些常见的 MySQL 内置函数及其使用说明和示例。 数值函数 ABS() 函数原…

静态资源导入探究

静态资源可以在哪里找呢&#xff1f;我们看看源码 从这个类进去 里面有个静态类 WebMvcAutoConfigurationAdapter 有个配置类&#xff0c;将这个类的对象创建并导入IOC容器里 这个静态类下有个方法 addResourceHandlers(ResourceHandlerRegistry registry)静态资源处理器 若自…

从零实现深度学习框架——Transformer从菜鸟到高手(一)

引言 &#x1f4a1;本文为&#x1f517;[从零实现深度学习框架]系列文章内部限免文章&#xff0c;更多限免文章见 &#x1f517;专栏目录。 本着“凡我不能创造的&#xff0c;我就不能理解”的思想&#xff0c;系列文章会基于纯Python和NumPy从零创建自己的类PyTorch深度学习框…

【环境配置】Windows下WSL将ubuntu挪位置-系统盘清理

问题–垃圾太多&#xff0c;系统盘空间占用太大 最近 C 盘空间暴涨&#xff0c;用工具 WinDirStat-强烈推荐的工具 查看发现 WSL 子系统占用了6个多 G 的空间&#xff0c;遂想办法挪个位置&#xff1b; 【关键字】将 Windows 里的子系统挪到非系统盘 D 盘&#xff1b; 解决 打…

生产服务器突然本机无法访问本机IP的端口

生产服务器突然本机无法访问本机IP的端口 一、现象描述 生产服务器突然无法访问自己本机IP地址的端口&#xff0c;通过localhost或者127.0.0.1都可以正常访问 二、问题分析 服务器是搭建在虚拟机上面&#xff0c;起初由于服务器内存不足的原因&#xff0c;导致了服务器故障无…

深度学习环境配置pytorch-GPU版本

一、下载与安装Anaconda 官网&#xff1a;https://www.anaconda.com/download 安装时添加环境变量勾选上&#xff0c;这样可以减少一步操作&#xff0c;不用再去自己手动添加了。 二、在anaconda里面创建虚拟环境 创建虚拟环境&#xff0c;其中pytorch为虚拟环境名&#xff0c;…

UNet 系列:做医学图像分割的任何人,都必须要会使用 nnU-Net

UNet 系列 UNet下采样和上采样跳跃连接 UNet&#xff1a;多层级和多尺度的密集链接nnUNet集成模型预处理训练过程推理后处理4行命令使用 nnUNet 训练自己的医学图像分割模型 UNet 经典的卷积神经网络都很深&#xff0c;越深的卷积层越适合处理大目标的东西&#xff0c;而医学病…

golang自带的命令行解析库flag库实践

1. 简介 flag用于解析命令行选项。有过类 Unix 系统使用经验的童鞋对命令行选项应该不陌生。例如命令ls -al列出当前目录下所有文件和目录的详细信息&#xff0c;其中-al就是命令行选项。 命令行选项在实际开发中很常用&#xff0c;特别是在写工具的时候。 指定配置文件的路径…

24考研数据结构-数组和特殊矩阵

目录 数据结构&#xff1a;数组与特殊矩阵数组数组的特点数组的用途 特殊矩阵对角矩阵上三角矩阵和下三角矩阵稀疏矩阵特殊矩阵的用途 结论 3.4 数组和特殊矩阵3.4.1数组的存储结构3.4.2普通矩阵的存储3.4.3特殊矩阵的存储1. 对称矩阵(方阵)2. 三角矩阵(方阵)3. 三对角矩阵(方阵…

图像处理之hough圆形检测

hough检测原理 点击图像处理之Hough变换检测直线查看 下面直接描述检测圆形的方法 基于Hough变换的圆形检测方法 对于一个半径为 r r r&#xff0c;圆心为 &#xff08; a , b &#xff09; &#xff08;a,b&#xff09; &#xff08;a,b&#xff09;的圆&#xff0c;我们将…

vscode里安装Go插件和配置Go环境

vscode是一款跨平台、轻量级、插件多的开源IDE&#xff0c;在vscode不仅可以配置C/C、Python、R、Ruby等语言的环境&#xff0c;还可以配置Go语言的环境。这里介绍在vscode里安装Go语言的插件和配置Go语言环境&#xff0c;系统是Win10 64位。 1、下载Go安装包和配置GOROOT、GO…

一年级数学 数一数(一到十)

今天我们来学习数一数 有一些老人 眼睛可能花了 需要我们在动物园数清楚是多少个动物 然后告诉他们 可能有的小朋友 不知道某些数字怎么读 您可以打开地址 https://fanyi.baidu.com/?aldtype16047#zh/en/ 将数字 输入到 输入框内 然后点击 下面的小话筒 系统就会读出来了 小…

高忆管理:多重利好共振 外资加码布局A股

资本商场活泼信号正在继续开释&#xff0c;内外资决心取得有力提振。以北向资金为代表的外资近来表现活泼&#xff0c;近六个买卖日已连续净买入超500亿元。多家外资组织近期表态称&#xff0c;伴跟着方针力度加强&#xff0c;我国经济有望继续复苏&#xff0c;活泼看好我国权益…

2023年8月美团外卖3-18元红包优惠券天天领取活动日历及美团外卖红包领取使用

2023年8月美团外卖3-18元红包天天领取活动日历 根据上图美团外卖红包领取活动时间表以下时间可以天天领取3-18元美团外卖红包优惠券&#xff1a; 1、2023年8月18日 可领取美团外卖18元神券节红包&#xff1b; 2、2023年8月每周六、周日每天可领取12元美团外卖节红包&#xff…

【C++】类和对象-继承

0.前言 1.基本语法 继承的用处就是极大的减少代码的重复性&#xff0c;如果没有用继承&#xff0c;看看以下代码&#xff0c;你知道了。。。。 基本实现代码&#xff1a; #include <iostream> using namespace std; /******************************************/void …

万界星空/推出生产制造执行MES系统/开源MES/免费下载

免费MES系统介绍 什么是MES系统呢&#xff1f;MES系统主要功能就是解决“如何生产”的问题。通过实施MES系统&#xff0c;一站式解决您所困扰的所有生产制作流程问题。 普通的免费MES系统只提供简单的基本功能让客户体验&#xff0c;而万界星空MES系统运用低代码的形式开发&a…

【二开】JeecgBoot-vue3二次开发 前端 扩展online表单js增强等-初始化列表之后执行

【二开】JeecgBoot-vue3二次开发 前端 扩展online表单js增强等-初始化列表之后执行 二开位置 OnlineAutoList.js.initAutoList 定义方法 /*** 初始化列表之后执行* js增强* param tableColumns* returns {Promise<void>|*}*/onlineTableContext["afterInitAutoList…

Codeforces Round 855 (Div. 3) E题题解

文章目录 [ Unforgivable Curse (hard version)](https://codeforces.com/contest/1800/problem/E2)问题建模问题分析方法1分析性质1.分析操作对元素位置的影响2.分析可以使用操作的元素可以与相邻元素交换位置的作用代码 方法2通过DFS得到相互可以交换位置的字符集合代码 方法…

Spring Boot的自动配置原理

一.原理解释 Spring Boot的自动配置是Spring框架的一个重要特性&#xff0c;它旨在简化应用程序的开发和部署过程。自动配置通过基于类路径中的依赖关系和配置文件内容来预先配置Spring应用程序的各种组件和功能。这样&#xff0c;我们可以在无需显式配置大量参数的情况下&…

消息中间件应用场景介绍

提高系统性能首先考虑的是数据库的优化&#xff0c;但是数据库因为历史原因&#xff0c;横向扩展是一件非常复杂的工程&#xff0c;所有我们一般会尽量把流量都挡在数据库之前。 不管是无限的横向扩展服务器&#xff0c;还是纵向阻隔到达数据库的流量&#xff0c;都是这个思路。…