什么是CPU上下文切换?css
如今linux是大多基于抢占式,CPU给每一个任务必定的服务时间,当时间片轮转的时候,须要把当前状态保存下来,同时加载下一个任务,这个过程叫作上下文切换。时间片轮转的方式,使得多个任务利用一个CPU执行成为可能,可是保存现场和加载现场,也带来了性能消耗。 那线程上下文切换的次数和时间以及性能消耗如何看呢? html
如何得到上下文切换的次数?java
vmstat直接运行便可,在最后几列,有CPU的context switch次数。 这个是系统层面的,加入想看特定进程的状况,可使用pidstat。 linux
执行pidstat,将输出系统启动后全部活动进程的cpu统计信息: 缓存
上下文切换的性能消耗在哪里呢?bash
context switch太高,会致使CPU像个搬运工,频繁在寄存器和运行队列直接奔波 ,更多的时间花在了线程切换,而不是真正工做的线程上。直接的消耗包括CPU寄存器须要保存和加载,系统调度器的代码须要执行。间接消耗在于多核cache之间的共享数据。 ide
引发上下文切换的缘由有哪些?工具
对于抢占式操做系统而言, 大致有几种:性能
一、当前任务的时间片用完以后,系统CPU正常调度下一个任务;测试
二、当前任务碰到IO阻塞,调度线程将挂起此任务,继续下一个任务;
三、多个任务抢占锁资源,当前任务没有抢到,被调度器挂起,继续下一个任务;
四、用户代码挂起当前任务,让出CPU时间;
五、硬件中断;
如何测试上下文切换的时间消耗?
LMbench,知道这个工具,是在霸爷的博客上面(http://blog.yufeng.info/archives/753),而后就开始在测试环境下搞了一把,一会就出结果了。而后就搞了台线上机器安装这个工具,而后测试,后面在测试Memory的时候,直接致使Load飙升,还好没人发现,机器java进程重启就行了。这方面纯粹是业务选手。霸爷说分析的结果对于高性能C的开发同窗来讲,是须要熟记的,没办法,咱是搞java的,只能每一个指标逐个看一下了。
LMbench的简单介绍?
首先看英文介绍:LMbench -Tools for Performance Analysis,微观性能分析工具。
LMbench主要能干啥?
主要是带宽(读取缓存文件、内存拷贝、读写内存、管道等)和反应时间(上下文切换、网路、进程建立等)的评测工具。
LMbench 安装?
中间遇到一个问题,就是报错,在CSDN上面找到了答案,这这里贴一下。
LMbench关于结果解释(此次主要关注线程切换信息)
在网上找了半天,信息不多,只能看doc下面的英文解释了。
测试上下文切换的时间,一个上下文切换,包括保存一个进程状态的保存和恢复另一个进程的时间。
典型的上下文切换性能,仅仅是测量最小的线程切换时间。仅仅是作进程切换,任何实质的任务都不作。
LMbench是如何来测量进程切换的时间的?
文章参考:
霸爷和周忱的博客