CPU上下文切换分析
一、CPU上下文切换
1、上下文切换,有时也称做进程切换或任务切换,是指CPU从一个进程或线程切换到另一个进程或线程。
2、vmstat是一个常用的系统性能分析工具,主要用来分析系统内存使用情况,也常用来分析CPU上下文切换和中断的次数。
例:vmstat -w

上下文切换需要特别关注的四列内容:
cs(context switch) 是每秒上下文切换的次数。
in(interrupt) 则是每秒中断的次数。
r(Running or Runnable) 是就绪队列的长度。
b(Blocked) 则是处于不可中断睡眠状态的进程数。
这个例子中的上下文切换次数 cs 是 12 次,系统中断次数in则是93次,而就绪队列长度 r 和不可中断状态进程数 b 都是 0。
3、vmstat只给出了系统总体的上下文切换情况,如果要看每个进程的详细情况,就需要pidstat了,加上-w选项
例:pidstat -w 2

需关注:cswch ,表示每秒自愿上下文切换(voluntary context switches)的次数
nvcswch ,表示每秒非自愿上下文切换(non voluntary context switches)的次数。
自愿上下文切换:是指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换。
非自愿上下文切换:则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换。
二、使用sysbench 来模拟系统多线程调度切换的情况
2、解压tar xvf sysbench-0.4.12.14.tar.gz
3、进入解压目录并执行 ./configure
4、make && make install
5、在第一个终端执行 sysbench --num-threads=10 --max-time=300 --max-requests=10000000 --test=threads run

6、在第二个终端运行vmstat观察上下文切换情况:
vmstat -w 1 3

可以发现,上下文切换cs已经上升到了256万,同时:
r 列:就绪队列的长度已经到了 9,远远超过了系统 CPU 的个数 2,所以肯定会有大量的 CPU 竞争。
us(user)和 sy(system)列:这两列的 CPU 使用率加起来上升到了 100%,其中系统 CPU 使用率,也就是 sy 列高达 89%,说明 CPU 主要是被内核占用了。
in 列:中断次数也上升到了 3000左右。
综合这几个指标,我们可以知道,系统的就绪队列过长,也就是正在运行和等待 CPU 的进程数过多,导致了大量的上下文切换,而上下文切换又导致了系统 CPU 的占用率升高。
7、使用pidstat查看CPU和进程上下文切换情况:
pidstat -wt -u 1 3 # -wt 参数表示输出线程指标,而 -u 参数则表示输出 CPU 使用指标

从 pidstat 的输出你可以发现,CPU 使用率的升高果然是 sysbench 导致的,它的 CPU 使用率已经达到了 194%,虽然 sysbench 进程(也就是主线程)的上下文切换次数看起来很少,但是它的子线程的上下文切换次数却有很多。看来,上下文切换罪魁祸首,还是过多的 sysbench 线程。
8、继续查看中断次数的详细信息
执行:watch -d cat /proc/interrupts # -d表示高亮显示变化的参数

观察一段时间,可以发现变化最快的是重新调度中断(RES),这个中断类型表示,唤醒空闲状态的 CPU 来调度新的任务运行。这是多处理器系统(SMP)中,调度器用来分散任务到不同 CPU 的机制,通常也被称为处理器中断。
总结:
每秒上下文切换多少次算正常?
这个数值主要取决于系统CPU的性能,如果上下文切换比较稳定,那在1万以下都算是正常,如果超过1万或者切换次数出现很大的增长,就很可能出现了性能问题。
cswch ,自愿上下文切换的次数增多了,说明系统正在等待资源,有可能发生了I/O等其它问题;
nvcswch ,非自愿上下文切换的次数增多了,说明进程都在强制调度,也就是在争抢CPU,说明CPU性能成了瓶颈;
in,中断次数增多了,说明CPU被中断,通过分析/proc/interrupt文件来确认中断类型。
CPU上下文切换分析的更多相关文章
- CPU 上下文切换及案例分析
什么是CPU 上下文 我们都知道,Linux是一个多任务操作系统,它远支持大于CPU数量的任务同时运行,当然,这些任务实际上并不是真的在同时运行,而是因为系统在很短时间内,将CPU轮流分配给他们,造成 ...
- CPU上下文切换
CPU上下文切换包括进程上下文切换.线程上下文切换及中断上下文切换,当任务进行io或发生时间片事件及发生中断(如硬件读取完成)时,就会进入内核态,发生CPU上下文切换. 进程上下文切换,进程的上下文信 ...
- 【转】CPU上下文切换的次数和时间(context switch)
http://iamzhongyong.iteye.com/blog/1895728 什么是CPU上下文切换? 现在linux是大多基于抢占式,CPU给每个任务一定的服务时间,当时间片轮转的时候,需要 ...
- C/C++程序CPU问题分析
转载地址:http://www.10tiao.com/html/473/201606/2651473094/1.html 程序的CPU问题是另外一类典型的程序性能问题,很多开发人员都受到过程序CP ...
- Linux环境下的CPU消耗分析
在Linux系统中, CPU 主要用于中断,内核以及用户进程的任务处理,优先级为 中断 > 内核 > 用户进程.在CPU消耗分析中,我们还经常遇到下面几个概念. 上下文切换 ...
- CPU上下文切换的次数和时间(context switch)
什么是CPU上下文切换? 现在linux是大多基于抢占式,CPU给每个任务一定的服务时间,当时间片轮转的时候,需要把当前状态保存下来,同时加载下一个任务,这个过程叫做上下文切换.时间片轮转的方式,使得 ...
- cpu上下文切换(下)
--怎么查看系统的上下文切换情况 过多的上下文切换,会把cpu时间消耗在寄存器.内核栈以及虚拟内存等数据的保存和恢复上,缩短进程真正运行的时间,成了系统性能大幅下降的一个元凶. 查看,使用vmstat ...
- Linux性能优化从入门到实战:03 CPU篇:CPU上下文切换
linux操作系统是将CPU轮流分配给任务,分时执行的.而每次执行任务时,CPU需要知道CPU寄存器(CPU内置的内存)和程序计数器PC(CPU正在执行指令和下一条指令的位置)值,这些值是CPU执 ...
- 04 | 基础篇:经常说的 CPU 上下文切换是什么意思?(下)
上一节,我给你讲了 CPU 上下文切换的工作原理.简单回顾一下,CPU 上下文切换是保证 Linux 系统正常工作的一个核心功能,按照不同场景,可以分为进程上下文切换.线程上下文切换和中断上下文切换. ...
随机推荐
- hype-v上centos7部署高可用kubernetes集群实践
概述 在上一篇中已经实践了 非高可用的bubernetes集群的实践 普通的k8s集群当work node 故障时是高可用的,但是master node故障时将会发生灾难,因为k8s api serv ...
- [转载]python with语句的用法
https://www.cnblogs.com/DswCnblog/p/6126588.html 看这篇文章的时候看到了python的类名()用法,很好奇,上网查了下,原来这就相当于对类进行实例化了. ...
- 【科创人·独家】连续创业者高春辉的这六年:高强度投入打造全球领先的IP数据库
您能看到:高春辉的创业观,IPIP.NET半程复盘及未来规划,连续创业的体验,小众产品趣事 您看不到:往年创业的回顾,技术干货,受制于篇幅忍痛割舍的精彩观点 文末彩蛋:<与雷军的分歧并非否定电商 ...
- Js的原型和原型链讲解
原型:每个对象都会在其内部初始化一个属性,就是prototype 原型链:当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么他就会去prototype中去找,这个prototype中会有 ...
- #!/usr/bin/node 是什么意思
// 调用系统环境变量中的解释器执行文件 #!/usr/bin/node //如果不是默认安装位置这个地方可能就找不到,那么文件就是报错,所以有了另一种写法 #!/usr/bin/env node
- umi+antdpro 2.3
关于umi接管了路由之后的动态配置. 路由通过 router.js 配置文件自动生成. 在 models/ menu.js中可以获取到,但从这里获取到并过滤之后的其实不是路由配置. 正确过滤方式,通过 ...
- 【转】ESXi主机出现“主机上的系统日志存储在非持久存储器中”解决办法
原址:https://blog.csdn.net/mooncarp/article/details/50923483 当ESXi主机的底层操作系统安装在SD卡上时,在vCenter中配置该主机时,如果 ...
- 1、Bash Shell
一.什么是Bash shell BashShell是一个命令解释器,它在操作系统的最外层,负责用户程序与内核进行交互操作的一种接口,将用户输入的命令翻译给操作系统,并将处理后的结果输出至屏幕. 当我们 ...
- sql语句 小记录
select Name '姓名',Age '年龄',(select LessonName + ',' from Lesson where StudentId=s1.Id FOR XML PATH('' ...
- 数据总线&地址总线&控制总线
数据总线 (1) 是CPU与内存或其他器件之间的数据传送的通道. (2)数据总线的宽度决定了CPU和外界的数据传送速度. (3)每条传输线一次只能传输1位二进制数据.eg: 8根数据线一次可传送一个8 ...