【操作系统】聊聊CPU上下文切换实操

如何查看系统的上下文切换情况

上一篇文章我们说了过多的上下文切换,会把CPU时间消耗在寄存器、内核栈以及虚拟内存等数据的保存和恢复上,那么当出现系统的上下文切换过多的时候,我们如果通过监控指标查看呢。

vmstat 是一个常用的系统性能分析工具,主要用来分析系统的内存使用情况,也常用来分析 CPU 上下文切换和中断的次数。
vmstat 5 代表的是5S输出一组

root@qxlxi:/data# vmstat 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st0  0 1296640 195580 158788 2402740    0    1     3    23   22   46  0  0 99  0  00  0 1296640 222836 158788 2402740    0    0     0    17   52   92  1  1 99  0  0
  • cs(context switch)每秒上下文切换次数
  • in (interrupt) 每秒中断的次数
  • r (Running or Runnable) 是就绪队列的长度,也就是可运行的进程数(进行和等待)
  • b (Blocked) 处于不可中断睡眠状态的进程数

从图中可以看到cs是92次上下文切换 in 52次中断。就绪队列和不可中断进程数都是0

查看每个进程的数据,使用 pidstat -w

root@qxlxi:/data# pidstat -w 5
Linux 5.4.0-100-generic (qxlxi) 	09/23/2023 	_aarch64_	(2 CPU)12:45:26 PM   UID       PID   cswch/s nvcswch/s  Command
12:45:31 PM     0         9      0.20      0.00  ksoftirqd/0
12:45:31 PM     0        10      3.79      0.00  rcu_sched
12:45:31 PM     0        11      0.20      0.00  migration/0
12:45:31 PM     0        17      0.20      0.00  migration/1
12:45:31 PM     0        18      0.40      0.00  ksoftirqd/1
12:45:31 PM     0       365      0.80      0.00  kworker/0:1H-kblockd
12:45:31 PM     0       382      0.20      0.00  kworker/1:1H-kblockd
12:45:31 PM   118       876      1.80      0.00  avahi-daemon
12:45:31 PM     0       885      0.20      0.00  irqbalance
12:45:31 PM   128      1490      0.20      0.00  gsd-color
12:45:31 PM  1000      1615      2.00      0.00  systemd
12:45:31 PM  1000      1708      0.20      0.00  Xorg
12:45:31 PM  1000      1888      0.20      0.00  gnome-shell
12:45:31 PM  1000      2006      0.20      0.00  gsd-color
12:45:31 PM     0     19788      0.20      0.00  systemd-journal
12:45:31 PM     0     60439      1.00      0.00  multipathd
12:45:31 PM     0     88948      4.19      1.60  systemd-udevd
12:45:31 PM  1000    115630      0.20      0.00  gnome-control-c
12:45:31 PM     0    487397      2.00      0.00  kworker/u4:1-events_power_efficient
12:45:31 PM     0    488871      6.99      0.00  kworker/1:1-events
12:45:31 PM     0    489061      0.40      0.00  kworker/u4:0-events_freezable_power_
12:45:31 PM     0    489366      8.18      0.00  kworker/0:2-events
12:45:31 PM     0    489376      0.20      0.00  pidstat
  • cswch/s : 每秒自愿上下文切换(voluntary context switches)的次数
  • nvcswch/s:每秒非自愿上下文切换 (non voluntary context switches) 的次数

自愿上下文切换:进程获取不到自愿的时候,发生的上下文切换,比如IO、网络、内存资源不足的时候。
非自愿上下文切换:进程执行时间到了,被系统强制调度,进而发生上下文切换,比如大量进程竞争CPU

场景分析

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

模拟10个线程执行。

查看总体

root@qxlxi:/data# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st6  0 1296640 222000 158804 2403064    0    1     3    23   23   21  0  0 99  0  0
10  0 1296640 222000 158804 2403064    0    0     0    80 132863 2924643 15 80  5  0  05  0 1296640 222000 158804 2403064    0    0     0     0 142952 2734656 14 81  5  0  08  0 1296640 222000 158804 2403064    0    0     0     0 157159 2996906 14 85  1  0  07  0 1296640 221968 158804 2403064    0    0     0     0 140886 2726608 13 78  9  0  09  0 1296640 221968 158804 2403064    0    0     0     0 142394 2722918 14 80  6  0  0

查看上下文切换次数升级到200多万,而就绪队列达到了10,us和sy的和达到了100%,sy的占用率80多,肯定有大量的CPU竞争。重点的次数也达到了1W多。

综合分析,就绪队列过长,导致的大量进程上下文切换,从而导致系统CPU占用率更高。

查看进程

pidstat -w -u 1 查看进程上下文切换数据

qxlxi@qxlxi:~$ pidstat -w -u 1
Linux 5.4.0-100-generic (qxlxi) 	09/23/2023 	_aarch64_	(2 CPU)12:51:09 PM   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
12:51:10 PM  1000      1699    0.98    0.00    0.00    0.00    0.98     0  gvfs-afc-volume
12:51:10 PM     0    489611   28.43  160.78    0.00    0.00  189.22     0  sysbench
12:51:10 PM  1000    489646    0.00    0.98    0.00    0.00    0.98     1  pidstat12:51:09 PM   UID       PID   cswch/s nvcswch/s  Command
12:51:10 PM     0        10      2.94      0.00  rcu_sched
12:51:10 PM     0        18      0.98      0.00  ksoftirqd/1
12:51:10 PM     0       382      0.98      0.00  kworker/1:1H-kblockd
12:51:10 PM  1000      1615      1.96      0.00  systemd
12:51:10 PM     0     60439      0.98      0.00  multipathd
12:51:10 PM     0    487195      6.86      0.00  kworker/0:1-events
12:51:10 PM     0    488871      5.88      0.00  kworker/1:1-events
12:51:10 PM     0    489585      0.98      0.00  kworker/u4:2-events_freezable_power_
12:51:10 PM  1000    489646      0.98     53.92  pidstat12:51:10 PM   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
12:51:11 PM   128      1420    1.00    0.00    0.00    0.00    1.00     0  gnome-shell
12:51:11 PM     0    489611   26.00  161.00    0.00    0.00  187.00     0  sysbench12:51:10 PM   UID       PID   cswch/s nvcswch/s  Command
12:51:11 PM     0        10      8.00      0.00  rcu_sched
12:51:11 PM     0        18      3.00      0.00  ksoftirqd/1
12:51:11 PM   128      1420      3.00     12.00  gnome-shell
12:51:11 PM  1000      1615      2.00      0.00  systemd
12:51:11 PM  1000      1888      3.00      8.00  gnome-shell
12:51:11 PM     0     60439      1.00      0.00  multipathd
12:51:11 PM     0    487195      7.00      0.00  kworker/0:1-events
12:51:11 PM     0    487397     47.00      0.00  kworker/u4:1-events_unbound
12:51:11 PM  1000    488358     10.00      0.00  sshd
12:51:11 PM     0    488871      4.00      0.00  kworker/1:1-events
12:51:11 PM     0    489585    206.00      0.00  kworker/u4:2-events_unbound
12:51:11 PM  1000    489646      1.00    253.00  pidstat12:51:11 PM   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
12:51:12 PM     0    489611   19.00  169.00    0.00    0.00  188.00     0  sysbench
12:51:12 PM  1000    489646    0.00    1.00    0.00    1.00    1.00     1  pidstat12:51:11 PM   UID       PID   cswch/s nvcswch/s  Command
12:51:12 PM     0        10      4.00      0.00  rcu_sched
12:51:12 PM     0        18     10.00      0.00  ksoftirqd/1
12:51:12 PM  1000      1615      2.00      0.00  systemd
12:51:12 PM  1000      2130      1.00      0.00  evolution-alarm
12:51:12 PM     0     60439      1.00      0.00  multipathd
12:51:12 PM     0    487195      4.00      0.00  kworker/0:1-events
12:51:12 PM     0    487397    165.00      0.00  kworker/u4:1-events_unbound
12:51:12 PM  1000    488358     18.00      0.00  sshd
12:51:12 PM     0    488871      5.00      0.00  kworker/1:1-events
12:51:12 PM     0    489585    113.00      0.00  kworker/u4:2-events_freezable_power_
12:51:12 PM  1000    489646      1.00    289.00  pidstat12:51:12 PM   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
12:51:13 PM     0    489611   27.00  158.00    0.00    0.00  185.00     0  sysbench12:51:12 PM   UID       PID   cswch/s nvcswch/s  Command
12:51:13 PM     0        10      5.00      0.00  rcu_sched
12:51:13 PM     0        11      1.00      0.00  migration/0
12:51:13 PM     0        17      1.00      0.00  migration/1
12:51:13 PM     0        18      1.00      0.00  ksoftirqd/1
12:51:13 PM  1000      1615      2.00      0.00  systemd
12:51:13 PM     0     60439      1.00      0.00  multipathd
12:51:13 PM     0    487195      8.00      0.00  kworker/0:1-events
12:51:13 PM     0    487397     96.00      0.00  kworker/u4:1-flush-253:0
12:51:13 PM  1000    488358     15.00      0.00  sshd
12:51:13 PM     0    488871      5.00      0.00  kworker/1:1-events
12:51:13 PM     0    489585    165.00      0.00  kworker/u4:2-events_unbound
12:51:13 PM  1000    489646      1.00    258.00  pidstat

从图中可以发现,切换较多的自愿上下文切换是进程 kworker/u4:2-events_unbound,而这里只是显示的是进程的上下文切换,而CPU在运行的是时候, Linux 调度的基本单位实际上是线程

pidstat -wt 1  可以查看线程的指标1:06:41 PM   UID      TGID       TID   cswch/s nvcswch/s  Command
01:06:43 PM     0         1         -      0.92      0.00  systemd
01:06:43 PM     0         -         1      0.92      0.00  |__systemd
01:06:43 PM     0        10         -     19.27      0.00  rcu_sched
01:06:43 PM     0         -        10     19.27      0.00  |__rcu_sched
01:06:43 PM     0        18         -      8.26      0.00  ksoftirqd/1
01:06:43 PM     0         -        18      8.26      0.00  |__ksoftirqd/1
01:06:43 PM     0       382         -      0.92      0.00  kworker/1:1H-kblockd
01:06:43 PM     0         -       382      0.92      0.00  |__kworker/1:1H-kblockd
01:06:43 PM     0         -       937      0.92      0.00  |__gmain
01:06:43 PM   128         -      1300      0.92      0.00  |__gvfs-afc-volume
01:06:43 PM   128         -      1422      0.92      0.00  |__gmain
01:06:43 PM  1000      1615         -      1.83      0.00  systemd
01:06:43 PM  1000         -      1615      1.83      0.00  |__systemd
01:06:43 PM  1000         -      1700      0.92      0.00  |__gvfs-afc-volume
01:06:43 PM  1000      1708         -      3.67      0.00  Xorg
01:06:43 PM  1000         -      1708      3.67      0.00  |__Xorg
01:06:43 PM  1000      1888         -      2.75      0.00  gnome-shell
01:06:43 PM  1000         -      1888      2.75      0.00  |__gnome-shell
01:06:43 PM  1000         -      1900      0.92      0.00  |__gmain
01:06:43 PM  1000         -      2336      0.92      0.00  |__gmain
01:06:43 PM  1000         -      2745      0.92      0.00  |__gmain
01:06:43 PM     0         -     56981      0.92      0.00  |__gmain
01:06:43 PM     0     60439         -      0.92      0.00  multipathd
01:06:43 PM     0         -     60439      0.92      0.00  |__multipathd
01:06:43 PM     0         -     60443      0.92      0.00  |__multipathd
01:06:43 PM     0    487397         -      0.92      0.00  kworker/u4:1-events_freezable_power_
01:06:43 PM     0         -    487397      0.92      0.00  |__kworker/u4:1-events_freezable_power_
01:06:43 PM  1000    489904         -      1.83      0.00  baobab
01:06:43 PM  1000         -    489904      1.83      0.00  |__baobab
01:06:43 PM     0    490271         -      7.34      0.00  kworker/0:2-events
01:06:43 PM     0         -    490271      7.34      0.00  |__kworker/0:2-events
01:06:43 PM     0    490366         -      3.67      0.00  kworker/1:3-events
01:06:43 PM     0         -    490366      3.67      0.00  |__kworker/1:3-events
01:06:43 PM     0         -    490582  37280.73 249111.93  |__sysbench
01:06:43 PM     0         -    490583  30613.76 227590.83  |__sysbench
01:06:43 PM     0         -    490584  42267.89 214733.03  |__sysbench
01:06:43 PM     0         -    490585  36483.49 247768.81  |__sysbench
01:06:43 PM     0         -    490586  35252.29 251989.91  |__sysbench
01:06:43 PM     0         -    490587  35150.46 240639.45  |__sysbench
01:06:43 PM     0         -    490588  33030.28 207896.33  |__sysbench
01:06:43 PM     0         -    490589  34731.19 233100.00  |__sysbench
01:06:43 PM     0         -    490590  39934.86 232202.75  |__sysbench
01:06:43 PM     0         -    490591  36001.83 261024.77  |__sysbench
01:06:43 PM     0    490592         -      0.92   2479.82  pidstat
01:06:43 PM     0         -    490592      0.92   2502.75  |__pidstat

到此,我们就分析出,上下文切换过多的进程是kworker。但是还有一个中断次数过多的问题。

因为中断是发生在内核中的,所以我们需要通过/proc中的信息进行查看。

watch -d cat /proc/interrupts 

小结

本篇主要介绍了查看上下文切换的几个常用命令,分别是

vmstat 5 //总体监控
pidstat -w 5 //进程监控
pidstat -w -u 1 //-w 参数表示输出进程切换指标,而 -u 参数则表示输出 CPU 使用指标
pidstat -wt 1 // -wt 参数表示输出线程的上下文切换指标
watch -d cat /proc/interrupts //内核中断指标

而自愿上下文切换边多,说明进程在等待资源,可能发生了IO问题
非自愿上下文切换过多,说明进程在被强制调度,争抢CP
中断次数过多,说明CPU被中断程序占用

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

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

相关文章

免费玩云上大数据--海汼部落实验室

玩大数据遇到的问题 大家好,这次分享一个免费的大数据部署工具,并非是给人家打广告,试过了真的爽。 学习大数据的人都知道,如果用VMware模拟Linux搭建大数据集群的话我们需要很高的内存和硬盘内存,随随便便跑一下mapre…

【云原生】Kubernetes学习笔记

部署 在部署前强调几点 不要使用IPv6, 很多组件都不支持IPv6不要使用最新版本, 最新版本非常不稳定, 甚至可能存在无法运行的bug不要版本更新, 安装后就将版本固定下来, 新的版本可能会引入新功能, 或移除旧功能, 导致Kubernetes无法运行 Kubeadm介绍 K8s是由多个模块构成的…

2023华为杯数模C题——大规模创新类竞赛评审方案研究

B题——大规模创新类竞赛评审方案研究 思路:采用数据分析等手段改进评分算法性能 完成情况(1-2问已经完成) 代码下载 问题一 在每个评审阶段,作品通常都是随机分发的,每份作品需要多位评委独立评审。为了增加不同评审专家所给成绩之间的可比…

解决因为修改SELINUX配置文件出错导致Faild to load SELinux poilcy无法进入CentOS7系统的问题

一、问题 最近学习Kubernetes,需要设置永久关闭SELINUX,结果修改错了一个SELINUX配置参数,关机重新启动后导致无法进入CentOS7系统,卡在启动进度条界面。 二、解决 多次重启后,在启动日志中发现 Faild to load SELinux poilcy…

简单的自托管书签服务NeonLink

什么是 NeonLink ? NeonLink 是一个简单且开源的自托管书签服务。它是轻量级的,使用最少的依赖项,并且易于通过 Docker 安装。由于系统要求较低,该应用程序非常适合部署在 RaspberryPI 上。 安装 在群晖上以 Docker 方式安装。 …

【ES6】

ES6 1 ES6简介1.1 什么是ES61.2 为什么使用ES6 2 ES6的新增语法2.1 let2.2 const2.3 let、const、var的区别2.4 解构赋值2.4.1 数组解构2.4.2 对象解构 2.5 箭头函数2.6 剩余参数 3 ES6的内置对象扩展3.1 Array的扩展方法3.1.1 扩展运算符(展开语法)3.1.2 构造函数方法&#xf…

Docker 部署 Bitwarden RS 服务

Bitwarden RS 服务是官方 Bitwarden server API 的 Rust 重构版。因为 Bitwarden RS 必须要通过 https 才能访问, 所以在开始下面的步骤之前, 建议先参考 《Ubuntu Nginx 配置 SSL 证书》 配置好域名和 https 访问。 部署 Bitwarden RS 拉取最新版本的 docker.io/vaultwarden…

vite + vue3 的项目中使用 vitest 做单元测试(仅供参考)

一、配置文件 // vitest.config.tsimport { fileURLToPath } from node:url import { mergeConfig, defineConfig } from vite import { configDefaults } from vitest/config // import viteConfig from ./vite.configimport vue from vitejs/plugin-vue import vueJsx from …

第一百五十二回 自定义组件综合实例:游戏摇杆三

文章目录 内容回顾优化性能示例代码我们在上一章回中介绍了 如何实现游戏摇杆相关的内容,本章回中将继续介绍这方面的知识.闲话休提,让我们一起Talk Flutter吧。 内容回顾 我们在前面章回中介绍了游戏摇杆的概念以及实现方法,并且通过示例代码演示了实现游戏摇杆的整个过程…

Windows安装cuda和cudnn教程最新版(2023年9月)

文章目录 cudacudnn cuda 查看电脑的cuda最高驱动版本(适用于N卡电脑-Nvidia) winR打开命令行,输入nvidia-smi 右上角cuda -version就是目前支持的最高cuda版本,目前是12.2 nvidia官网下载cuda 下载地址:https://d…

基于eBPF的安卓逆向辅助工具——stackplz

前言 stackplz是一款基于eBPF技术实现的追踪工具,目的是辅助安卓native逆向,仅支持64位进程,主要功能如下: hardware breakpoint 基于pref_event实现的硬件断点功能,在断点处可读取寄存器信息,不会被用户…

C/C++自定义读取ini、cfg配置文件

常见cfg、ini文件如下: [config1] setting192.168.1.1 [config2] setting192.168.1.2 [config3] setting192.168.1.3 示例代码使用 // opt_ini.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //#include <iostream> #include "cfg.h"…

短信登录功能如何实现?

简介&#xff1a; 在日常生活中我们登录/注册某些网站/APP是通常可以选择 密码登录和手机号登录。 为什么手机号发送后会有验证码返回呢&#xff1f; 网站如何识别我的验证码是否正确&#xff1f; 如果我的个人网站也想要实现短信登录功能&#xff0c;具体该如何实现&#xff1…

获取文件创建时间

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Java源码 public void testGetFileTime() {try {String string "E://test.txt";File file new File(string);Path path file.toPath();BasicFileAttributes ba…

RedHat 服务器安装NGINX

参照官方文档&#xff1a;nginx: Linux packages 按顺序操作&#xff1a; 安装前提&#xff1a; sudo yum install yum-utils 设置yum仓库&#xff08;执行命令的时候会自动新建文件&#xff09;&#xff1a; sudo vi /etc/yum.repos.d/nginx.repo 粘贴下面的内容保存退出…

一个电子信息工程学生的历程和内心感想

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、我对大学三年专业课程的理解二、我为什么本科选择研究嵌入式这个方向&#xff1f;1.可以把理论变为实际应用——兴趣是最好的老师。2.嵌入式方向可以打的比赛非…

如何把利用paddlepaddle导出的json文件转化为yolo或者voc文件

目录 1. 修改源码&#xff0c;让模型能够生成出对于单个图像的标注。 2. 把数据转为yolo格式 3.把yolo格式转化为xml格式 这两天想偷懒&#xff0c;想让模型先在数据上标一遍&#xff0c;然后我再做修正&#xff0c;主要是图个省事。由于我们主要是利用paddle,模型也是基于p…

冒泡排序与选择排序(最low的两兄弟)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言&#xff1a; 在我们的生活中&#xff0c;无处不在用到排序&#xff0c;比如说成绩的排名&#xff0c;淘宝&#xff0c;京东等等商品在各个方面的排序&#xff0c;这样看来一个好的算 法很重要&#xff0c;接下来我们要先…

文件操作和IO

文章目录 一、文件系统二、文件类型三、文件系统操作3.1File类的属性3.2File类的构造方法3.3File类的方法 四、文件内容操作4.1Reader类里的函数4.2Writer类里的函数4.3InputStream类里的函数4.4OutputStream类里的函数4.5字节流转换为字符流 一、文件系统 1、操作系统会把很多…

【刷题-牛客】链表内指定区间反转

链表定区间翻转链表 题目链接题目描述核心思想详细图解代码实现复杂度分析 题目链接 链表内指定区间反转_牛客题霸_牛客网 (nowcoder.com) 题目描述 核心思想 遍历链表的过程中在进行原地翻转 [m,n]翻转区间记作子链表,找到子链表的 起始节点 left 和 终止节点 right记录在…