检查 CPU 的上下文切换

news2024/9/21 11:06:35

一.什么是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.coloradmin.cn/o/821632.html

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

相关文章

【【STM32学习-3】】

STM32学习-3 下面是对c语言的稍微复习 这个是我们设置好的文件 以后拖出去用就可以了 这里加入关于指针的感想 关于指针数组和数组指针的想法 常规的东西是int a10; int * p&a; &#xff08;p指向了a元素&#xff0c;意思是p等于a的地址 类型是int*&#xff09;就是 整型指…

“ \r “导致print打印被覆盖

这里写自定义目录标题 写在最前面1." \r " 回车符一些有趣的小功能倒计时加载中&#xff08;转圈&#xff09;进度条删除功能 强行不换行(1) python2中可以在print语句的末尾加上逗号&#xff08;2&#xff09;在python3里print是一个独立函数&#xff0c;可以通过修…

笔记02:CUDA编程模型

CUDA是一种通用的并行计算平台和编程模型&#xff0c;是在C语言基础上扩展的。 一、CUDA编程模型概述 1. CUDA编程结构 在一个异构环境中包含多个CPU和GPU&#xff0c;每个GPU和CPU的内存都由一条PCI-e总线分隔开&#xff0c;需要注意区分 &#xff08;1&#xff09;主机&a…

湖仓一体概念快问快答

概念篇 问题一 “湖仓一体”是什么&#xff1f; “湖仓一体”是一种新的架构模式&#xff0c;湖仓一体是将数据湖的灵活性和数仓的易用性、规范性、高性能结合起来的融合架构&#xff0c;无数据孤岛。湖仓一体数据存储在数据湖低成本的存储架构之上&am…

蓝桥云课ROS机器人旧版实验报告-07外设

项目名称 实验七 ROS[Kinetic/Melodic/Noetic]外设 成绩 内容&#xff1a;使用游戏手柄、使用RGBD传感器&#xff0c;ROS[Kinetic/Melodic/Noetic]摄像头驱动、ROS[Kinetic/Melodic/Noetic]与OpenCV库、标定摄像头、视觉里程计&#xff0c;点云库、可视化点云、滤波和缩…

嵌入式系统工程师怎样才能不落伍

不断增加的复杂性和异质化正在衍生出一些新的方法&#xff0c;能够避免在设计周期结束时出现意外。 在一个系统中&#xff0c;硬件的表现是否优秀取决于运行在其上的软件。随着系统复杂性的增加&#xff0c;总是软件在拖后腿。 缩小硬件和软件差距的方法是不断改进软件开发的方…

【Java】多医院、多诊所、多机构SaaS模式云HIS信息管理系统源码

云HIS&#xff0c;一款基于云计算和大数据技术的智慧医院云平台&#xff0c;为医疗机构提供了一种全新的信息化解决方案&#xff0c;旨在实现数据安全、用户满意度和成本效益的最佳平衡。 基于云计算技术的B/S架构的HIS系统&#xff0c;为基层医疗机构提供标准化的、信息化的、…

攻击数亿个账户,黑客利用OAuth2.0疯狂作恶

一、OAuth协议介绍 OAuth是一种标准授权协议&#xff0c;它允许用户在不需要向第三方网站或应用提供密码的情况下向第三方网站或应用授予对存储于其他网站或应用上的信息的 委托访问 权限。OAuth通过访问令牌来实现这一功能。 1.发展历史 OAuth协议始于2006年Twitter公司Ope…

Python爬虫遇到URL错误解决办法大全

在进行Python爬虫任务时&#xff0c;遇到URL错误是常见的问题之一。一个错误的URL链接可能导致爬虫无法访问所需的网页或资源。为了帮助您解决这个问题&#xff0c;本文将提供一些实用的解决方法&#xff0c;并给出相关代码示例&#xff0c;希望对您的爬虫任务有所帮助。 一、…

mysql进阶-触发器

在实际开发中&#xff0c;我们经常会遇到这样的情况&#xff1a;有 2 个或者多个相互关联的表&#xff0c;如 商品信息 和 库存信息 分别存放在 2 个不同的数据表中&#xff0c;我们在添加一条新商品记录的时候&#xff0c;为了保证数据的完整性&#xff0c;必须同时 在库存表中…

牛客网Verilog刷题——VL41

牛客网Verilog刷题——VL41 题目答案 题目 请设计一个可以实现任意小数分频的时钟分频器&#xff0c;比如说8.7分频的时钟信号&#xff0c;注意rst为低电平复位。提示&#xff1a;其实本质上是一个简单的数学问题&#xff0c;即如何使用最小公倍数得到时钟周期的分别频比。设小…

23种设计模式详解与示例代码(详解附DEMO)

设计模式在Java中的应用与实现 &#x1f680;&#x1f680;&#x1f680;1.创建型模式1. 工厂方法模式&#xff08;Factory Pattern&#xff09;2.抽象工厂模式&#xff08;Abstract Factory Pattern&#xff09;3. 单例模式&#xff08;Singleton Pattern&#xff09;4.原型模…

Bug解决:ModuleNotFoundError: No module named ‘taming‘

from taming.modules.vqvae.quantize import VectorQuantizer2 as VectorQuantizer ModuleNotFoundError: No module named taming 在安装 taming-transformers时&#xff0c;出现了以下两个报错&#xff1a; 报错一&#xff1a; from taming.modules.vqvae.quantize import V…

使用langchain与你自己的数据对话(四):问答(question answering)

之前我已经完成了使用langchain与你自己的数据对话的前三篇博客&#xff0c;还没有阅读这三篇博客的朋友可以先阅读一下&#xff1a; 使用langchain与你自己的数据对话(一)&#xff1a;文档加载与切割使用langchain与你自己的数据对话(二)&#xff1a;向量存储与嵌入使用langc…

2023CRM如何选型?有哪些特点需要注意?

企业管理中客户关系管理系统被认为是至关重要的一环。随着市场竞争加剧和科技不断发展&#xff0c;企业面临着各种选择&#xff0c;如何选择适合自己的CRM系统变得非常重要。本文将为您介绍2023CRM选型最新指南。 首先&#xff0c;应该了解CRM系统的分类&#xff0c;根据自己的…

LeetCode每日一题——1331.数组序号转换

题目传送门 题目描述 给你一个整数数组 arr &#xff0c;请你将数组中的每个元素替换为它们排序后的序号。 序号代表了一个元素有多大。序号编号的规则如下&#xff1a; 序号从 1 开始编号。一个元素越大&#xff0c;那么序号越大。如果两个元素相等&#xff0c;那么它们的…

【Python机器学习】实验07 K-means无监督聚类

文章目录 聚类K-means 聚类1 准备数据2 给定聚类中心&#xff0c;计算每个点属于哪个聚类&#xff0c;定义函数实现3 根据已有的数据的标记&#xff0c;来重新更新聚类中心&#xff0c;定义相应的函数4 初始化聚类中心&#xff0c;定义相应的函数5 定义K-means算法6 绘制各个聚…

windwos server 2008 更新环境,且vs_redis 安装失败

KB2919442 下载地址:https://www.microsoft.com/zh-cn/download/confirmation.aspx?id42153 KB2919355 下载地址:https://www.microsoft.com/zh-cn/download/confirmation.aspx?id42153 安装步骤:先安装442,后安装355

C++ 对象的生存期

对象&#xff08;包括简单变量&#xff09;都有诞生和消失的时刻。对象诞生到结束的这段时间就是它的生存期。在生存期内&#xff0c;对象将保持它的状态&#xff08;即数据成员的值&#xff09;&#xff0c;变量也将保持它的值不变&#xff0c;直到它们被更新为止。对象的生存…

windows下安装anaconda、pycharm、cuda、cudnn、PyTorch-GPU版本

目录 一、anaconda安装及虚拟环境创建 1.anaconda的下载 2.Anaconda的安装 3.创建虚拟环境 3.1 环境启动 3.2 切换镜像源 3.3环境创建 3.4 激活环境 3.5删除环境 二、pycharm安装 1.pycharm下载 2.pycharm的安装 三、CUDA的安装 1.GPU版本和CUDA版本、cudnn版本、显卡…