【人间995】【Linux性能优化】CPU 上下文切换

数据治
• 阅读 2322

哔前哔言

  • 始终践行费曼学习法
  • 理解系统知识原理
  • 掌握性能分析工具
  • 多实践,多思考,多提问
  • 仅记录个人的学习记录,欢迎指点纠正

1、CPU上下文

1.1、定义

CPU上下文:CPU寄存器和程序计数器

  •  寄存器:CPU内置的容量小,但速度极快的内存
  •  程序计数器:用来存储正在执行指令的位置或即将执行的下一条指令位置

CPU上下文切换:保存上一个任务运行的寄存器和计数器信息切换到加载下一个任务的寄存器和计数器的过程

CPU上下文切换,是保证系统工作的核心功能之一

1.2、分类

1.2.1、进程上下文切换

进程既可以在用户空间运行(进程用户态),也可以在内核空间运行(进程内核态

用户态到内核态的转变,需要通过系统调用完成

一次系统调用过程,两次CPU上下文切换:

  • 先保存原来用户态的指令位置,更新内核态指令的新位置,跳转到内核态运行内核任务(用户态-->内核态)
  • 系统调用结束后,恢复寄存器保存的用户态,跳转回用户空间,继续运行进程 (内核态→用户态)

区别

序号 进程上下文切换 系统调用
1 - 从一个进程切换到另一个进程运行 - 同一个进程在运行【特权模式切换】 - 系统调用过程中会发生CPU的上下文切换
2 - 需保存 虚拟内存,栈,全局变量 等用户空间的资源,- 需保存内核堆栈,寄存器等内核空间的状态 - 需保存 虚拟内存,栈,全局变量 等用户空间的资源

场景

  • 以时间片段划分进程,时间片段耗尽,就会发生系统调度,切换到另一在等待的进程
  • 系统资源不足时,需等待资源满足后才能运行,就会挂起当前进程,然后系统调度其他进程运行
  • sleep函数使进程主动挂起,然后系统调度其他进程运行
  • 当优先级高的进程运行时,当前进程会被挂起,先执行优先级高的进程
  • 发生硬件中断时,当前进程中断挂起,然后执行中断程序
1.2.2、线程上下文切换

线程调度的基本单位,进程资源拥有的基本单位。所以,内核任务调度时,是在调度线程,进程是提供虚拟内存,全局变量等资源。

线程上下文切换 同一进程内线程 不同进程间线程
前提 进程只有一个线程,则进程等于线程 虚拟内存和全局变量资源共享 资源不共享
切换过程 只需保存线程私有的数据,寄存器等不共享资源 保存线程私有的数据 保存进程的虚拟内存和全局变量等资源
1.2.3、中断上下文切换
  • 中断优先级会打断进程的正常调度和执行,然后去处理中断处理程序
  • 对于同一个CPU来说,中断处理比进程拥有更高的优先级

2、分析CPU上下文

过多的上下文切换,会影响系统的整体性能。

2.1、分析标准

2.1.1、vmstat 系统性能分析工具,输出系统总体的上下文切换情况。

【人间995】【Linux性能优化】CPU 上下文切换

  • cs  每秒上下文切换次数
  • in  每秒中断的次数
  • r  就绪队列长度,也就是正在运行和等待CPU的进程次数
  • b 处于不可中断状态进程数
2.1.2、pidstat -w 查看每个进程上下文切换的情况

【人间995】【Linux性能优化】CPU 上下文切换

  • cswch/s 每秒自愿上下文切换的次数【进程无法获取所需资源导致上下文切换】
  • nvcswch/s  每秒非资源上下文切换次数【进程由于时间片已到等原因,被系统强制调度而发生山下文切换】

2.2、实践

#10个线程运行5分钟的基准测试,模拟多线程切换问题
sysbench --threads=10 --max-time=300 threads run

【人间995】【Linux性能优化】CPU 上下文切换

#每隔1秒输出1组数据
vmstat1

【人间995】【Linux性能优化】CPU 上下文切换

# 每隔``1``秒 输出``1``组数据
# -w 参数表示输出进程切换指标,-u 参数则表示输出CPU使用指标

【人间995】【Linux性能优化】CPU 上下文切换

#-wt 参数表示输出线程的上下文切换指标
pidstat -wt``1

【人间995】【Linux性能优化】CPU 上下文切换

# -d 高亮显示变化的区域
watch -d cat /proc/interrupts

【人间995】【Linux性能优化】CPU 上下文切换

疑问:没有看到重调度??

看不见RES是因为窗体开的太小,RES在最下面

3、总结

主要学习了CPU上下文,上下文分类,各分类的上下文切换的工作原理。

使用工具

  • sysbench 模拟多线程工作,
  • vmstat查看系统总体上下文切换次数【cs】,中断次数【in】,就绪队列【r】,不可中断进程数【b】
  • pidstat -wt 查看进程的每秒资源上下文切换次数【cswch】,每秒非资源上下文切换次数【nvcswch】
  • 查看了中断文件/proc/interrupts中分析

4、附录

1、工具

1.1、vmstat工具,系统性能分析工具,用来分析系统内存使用情况,分析CPU上下文切换和中断的次数

安装sysbench ,centos

curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash

sudo yum -y install sysbench

1.2、sysbench工具,多线程基准测试工具,用来评估不同系统参数下的数据库负载情况

#10个线程运行5分钟的基准测试,模拟多线程切换问题  
sysbench --threads=10 --max-time=300 threads run

2、引用

  • 《极客时间》Linux性能优化实践
点赞
收藏
评论区
推荐文章
Stella981 Stella981
3年前
LinkWeChat 基于企业微信的SCRM私域流量开源系统
LinkWeChat(https://gitee.com/LinkWeChat/linkwechat"LinkWeChat")平台介绍LinkWeChat(https://gitee.com/Li
Wesley13 Wesley13
3年前
PHP安全性防范方式
<h2SQL注入</h2<pSQL注入是一种恶意攻击,用户利用在表单字段输入SQL语句的方式来影响正常的SQL执行。</p<h4防范方式</h4<ul<li使用mysql\_real\_escape\_string(),或者addslashes()过滤数据</li<li手动检查每一数据是否为正确的数据类型</li<li使用
Wesley13 Wesley13
3年前
Activiti 工作流入门指南
<divclass"htmledit\_views"id"content\_views"<h1<aname"t0"</a概览</h1<p如我们的介绍部分所述,Activiti目前分为两大类:</p<ul<li<p<ahref"https://activiti.gitbook.io/activiti7deve
Stella981 Stella981
3年前
ASMSupport教程4.8 生成逻辑运算操作
<p在java中有以下逻辑运算符:</p<ul<li&amp;&amp;:条件与</li<li||:条件或</li<li&amp;:布尔型的逻辑与</li<li|:布尔型的逻辑或</li<li^:布尔型的逻辑异或</li<li!:非操作</li</ul<p那么接下来我们将些段例子
Wesley13 Wesley13
3年前
mysql 5.7 windows zip安装
<ol<limysql官网下载windowszip安装包并解压(D:wampmysql56winx64)</li<li添加pathD:wampmysql5722winx64bin</li<li创建data目录D:\\wamp\\mysql56winx64\\data</li<li<p创建mysql配置文
Stella981 Stella981
3年前
ASMSupport教程4.11 生成数组操作
<p在任何语言里,数组都是基本的数据类型,我们这一节将讲述如何生成数组操作。</p<p数组操作包括以下几个:</p<ol<li创建数组</li<li获取数组长度</li<li获取数组每个元素的内容</li<li为数组元素赋值</li</ol<p我们接下来对每种操作进行详解。</p<h3<fonts
Stella981 Stella981
3年前
IdeaVim
<divid"cnblogs\_post\_body"class"blogpostbodycnblogsmarkdown"<h3id"ideavim简介"IdeaVim简介</h3<pIdeaVim是IntelliJIDEA的一款插件,他提高了我们写代码的速度,对代码的跳转,查找也很友好。</p<ul<li安装位置</
Stella981 Stella981
3年前
Array.prototype.slice.call()的理解
最近在看廖雪峰的JS课程,浏览器中的操作DOM的那一章,有这样一道题。JavaScriptSwiftHTMLANSICCSSDirectX<!HTML结构<ulid"testlist"<liJavaScript</li
Stella981 Stella981
3年前
ASMSupport教程4.12 生成方法调用操作
<p这一节我们讲如何用ASMSupport生成方法调用的操作,方法调用包括下面四种类型:</p<ol<li调用构造方法<li调用静态方法<li调用非静态方法<li调用当前类的方法<li调用父类方法</li</ol<p首先我们需要看我们想要生成的类:</p<p代码1:</p<h3<divid"scid:9D
Stella981 Stella981
3年前
Linux 重定向与管道符
重定向与管道符重定向作用:将命令的执行结果输出到指定的文件中,而不是直接显示在屏幕上0标准输入键盘stdin仅读取1标准输出终端stdout仅写入2标准错误终端stderr仅写入3filename其他文件读/写在Li
Wesley13 Wesley13
3年前
HTML快捷写法大全
父子用\ \Ulli\3\<ul\    <li\</li\    <li\</li\    <li\</li\</ul\兄弟之间用,也可以省写\pspan\,\ul\<p\</p\<span