`
iamzhongyong
  • 浏览: 806787 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

CPU上下文切换的次数和时间(context switch)

 
阅读更多

        什么是CPU上下文切换?

        现在linux是大多基于抢占式,CPU给每个任务一定的服务时间,当时间片轮转的时候,需要把当前状态保存下来,同时加载下一个任务,这个过程叫做上下文切换。时间片轮转的方式,使得多个任务利用一个CPU执行成为可能,但是保存现场和加载现场,也带来了性能消耗。  那线程上下文切换的次数和时间以及性能消耗如何看呢?  

        

        

 

    ​    ​如何获得上下文切换的次数?

         vmstat直接运行即可,在最后几列,有CPU的context switch次数。 这个是系统层面的,加入想看特定进程的情况,可以使用pidstat。     

1
2
3
4
5
6
7
$ vmstat 1 100
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0     88 233484 288756 1784744    0    0     0    23    0    0  4  1 94  0  0
 4  0     88 233236 288756 1784752    0    0     0     0 6202 7880  4  1 96  0  0
 2  0     88 233360 288756 1784800    0    0     0   112 6277 7612  4  1 95  0  0
 0  0     88 232864 288756 1784804    0    0     0   644 5747 6593  6  0 92  2  0

    ​     ​执行pidstat,将输出系统启动后所有活动进程的cpu统计信息:       ​    

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
linux:~ # pidstat
Linux 2.6.32.12-0.7-default (linux)             06/18/12        _x86_64_
 
11:37:19          PID    %usr %system  %guest    %CPU   CPU  Command
……
11:37:19        11452    0.00    0.00    0.00    0.00     2  bash
11:37:19        11509    0.00    0.00    0.00    0.00     3  dd
11:37:19: pidstat获取信息时间点
PID: 进程pid
%usr: 进程在用户态运行所占cpu时间比率
%system: 进程在内核态运行所占cpu时间比率
%CPU: 进程运行所占cpu时间比率
CPU: 指示进程在哪个核运行
Command: 拉起进程对应的命令
备注:执行pidstat默认输出信息为系统启动后到执行时间点的统计信息,因而即使当前某进程的cpu占用率很高,输出中的值有可能仍为0

​    ​    

    ​    ​​上下文切换的性能消耗在哪里呢?

    ​    ​context switch过高,会导致CPU像个搬运工,频繁在寄存器和运行队列直接奔波  ,更多的时间花在了线程切换,而不是真正工作的线程上。直接的消耗包括CPU寄存器需要保存和加载,系统调度器的代码需要执行。间接消耗在于多核cache之间的共享数据。 

    ​

    ​    ​引起上下文切换的原因有哪些?

    ​    ​对于抢占式操作系统而言, 大体有几种:

    ​    ​1、当前任务的时间片用完之后,系统CPU正常调度下一个任务;

    ​    ​2、当前任务碰到IO阻塞,调度线程将挂起此任务,继续下一个任务;

    ​    ​3、多个任务抢占锁资源,当前任务没有抢到,被调度器挂起,继续下一个任务;

    ​    ​4、用户代码挂起当前任务,让出CPU时间;

    ​    ​5、硬件中断;

    ​   ​

    ​    ​如何测试上下文切换的时间消耗?

        LMbench,知道这个工具,是在霸爷的博客上面(http://blog.yufeng.info/archives/753),然后就开始在测试环境下搞了一把,一会就出结果了。然后就搞了台线上机器安装这个工具,然后测试,后面在测试Memory的时候,直接导致Load飙升,还好没人发现,机器java进程重启就好了。这方面纯粹是业务选手。霸爷说分析的结果对于高性能C的开发同学来说,是需要熟记的,没办法,咱是搞java的,只能每个指标逐个看一下了。

       ​ 

    ​    ​LMbench的简单介绍?

    ​    首先看英文介绍:LMbench -Tools for Performance Analysis,微观性能分析工具。

     ​   官方地址:http://www.bitmover.com/lmbench/

        ​下载地址:http://www.bitmover.com/lmbench/lmbench3.tar.gz 

        

    ​    ​LMbench​主要能干啥?

        ​主要是带宽(读取缓存文件、内存拷贝、读写内存、管道等)和反应时间(上下文切换、网路、进程创建等)的评测工具。

       

    ​    ​ LMbench ​安装?

1
2
3
4
#wget http://www.bitmover.com/lmbench/lmbench3.tar.gz
#tar -zxvf lmbench3.tar.gz
#cd lmbench3
#make

        ​中间遇到一个问题,就是报错,在CSDN上面找到了答案,这这里贴一下。

1
2
3
4
5
6
7
8
9
10
11
此时会报错:
   make[2]: *** 没有规则可以创建“bk.ver”需要的目标“../SCCS/s.ChangeSet”。 停止。
   make[2]:正在离开目录 `/home/hero/lmbench3/src'
   make[1]: *** [lmbench] 错误 2
   make[1]:正在离开目录 `/home/hero/lmbench3/src'
   make: *** [build] 错误 2
解决办法:
lmbench3目录下
   #mkdir SCCS
   #touch  ./SCCS/s.ChangeSet
   #make

       

    ​    ​ LMbench关于结果解释(这次主要关注线程切换信息)

        在网上找了半天,信息很少,只能看doc下面的英文解释了。    

        测试上下文切换的时间,一个上下文切换,包括保存一个进程状态的保存和恢复另外一个进程的时间。

        典型的上下文切换性能,仅仅是测量最小的线程切换时间。仅仅是做进程切换,任何实质的任务都不做。

1
2
3
4
5
6
Context switching - times in microseconds - smaller is better
-------------------------------------------------------------------------
Host                 OS  2p/02p/162p/648p/168p/6416p/1616p/64K
                         ctxsw  ctxsw  ctxsw ctxsw  ctxsw   ctxsw   ctxsw
--------- ------------- ------ ------ ------ ------ ------ ------- -------
commonway Linux 2.6.189.2400 4.0200 9.0300 7.5600 8.3800    11.6 6.28000
时间的单位是微秒。

    ​

        LMbench是如何来测量进程切换的时间的?  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
The benchmark is a ring of two to twenty processes that are connected
with Unix pipes.  A token is passed from process to process, forcing
context switches.  The benchmark measures the time it takes to pass
the token two thousand times from process to process.  Each hand off
of the token has two costs: (a) the context switch, and (b) the cost
of passing the token.  In order to get just the context switching time,the benchmark first measures the cost of passing the token through a
ring of pipes in a single process.  This time is defined as the cost
of passing the token and is not included in the reported context switch
time.
.PP
    When the processes are larger than the default baseline of ``zero''
(where zero means just big enough to do the benchmark), the cost
of the context switch includes the cost of restoring user level
state (cache lines).  This is accomplished by having the process
allocate an array of data and sum it as a series of integers
after receiving the token but before passing the token to the
next process.  Note that the overhead mentioned above includes
the cost of accessing the data but because it is measured in
just one address space, the cost is typically the cost with hot
caches.  So the context switch time does not include anything
other than the context switch provided that all the processes
fit in the cache.  If there are cache misses (as is common), the
cost of the context switch includes the cost of those cache misses.
.PP
    首先是看任务处理的时间(通过一次任务处理,这个任务处理的时间被定义为token时间,不包括线程切换的)。
    然后多次执行,排除任务执行的时间,然后计算出CS的时间(如果有cache miss,则CS的时间也包括cache misses的时间)。

 

文章参考:    

霸爷和周忱的博客

http://www.bitmover.com/lmbench/

https://www.usenix.org/legacy/publications/library/proceedings/sd96/full_papers/mcvoy.pdf

http://blog.csdn.net/taozi343805436/article/details/7876087 

http://blog.yufeng.info/archives/753

http://rdc.taobao.com/team/jm/archives/1706

 

2
1
分享到:
评论

相关推荐

    什么是context switch.doc

    上下文切换(Context Switch)是操作系统中的一个关键概念,它涉及到多任务处理和资源调度。在计算机系统中,中央处理器(CPU)一次只能执行一个进程或线程的指令。为了实现多个任务看似同时进行的“多工”效果,...

    测试Context Switch time()

    ### 一、上下文切换(Context Switch)简介 在操作系统中,上下文切换是指操作系统内核在多任务环境中将CPU资源从一个进程或线程转移到另一个进程或线程的过程。这个过程包括保存当前执行任务的状态(即上下文),并...

    RTT-Mini-context-switch.rar

    本项目聚焦于RT-Thread(Real-Time Thread)的一个重要概念——“上下文切换”(Context Switch),并具体演示了如何在STM32F10x微控制器上实现线程间的切换。STM32F10x是STMicroelectronics公司推出的基于ARM ...

    Project2任务二-context switch开销测量1

    在理解这些文件和函数的作用后,根据项目需求修改和扩展代码,以实现上下文切换时间的测量。 **5. 运行与测试** 首先,从课程网站获取代码,使用`make`命令编译项目,然后将生成的内核镜像写入SD卡。最后,通过...

    Project2任务一-多tasks启动与context switch1

    在这个“Project2任务一-多tasks启动与context switch1”中,我们将探讨多任务处理、上下文切换、进程和线程的概念,以及它们在操作系统中的实现。 首先,多任务是指操作系统同时处理多个任务或进程的能力。在非...

    linux进程切换核心代码switchto剖析实用教案.ppt

    首先,进程切换在Linux中分为两个阶段:上下文切换(Context Switch)和进程调度(Process Scheduling)。上下文切换是指保存当前进程的状态,并恢复下一个将要运行进程的状态。而进程调度则是决定哪个进程应该获得...

    switch_to_32.rar_flush

    在IT行业中,尤其是在操作系统和虚拟化技术领域,"switch_to_32.rar_flush"这个标题和描述涉及到的关键知识点是进程上下文切换(Context Switch)和内存管理,特别是针对32位环境的操作。以下是对这些概念的详细解释...

    mmu_context.rar_The Calling

    综上所述,"mmu_context.rar_The Calling"涉及的IT知识点主要围绕MMU上下文在操作系统内核中的重要角色和实现细节展开,包括进程间内存隔离、上下文切换机制以及相关的内核代码实现。理解这些概念对于开发和优化操作...

    api.rar_CPU使用率

    2. **上下文切换(Context Switch)**:当一个进程的时间片用完或者有更高优先级的进程需要执行时,操作系统会进行上下文切换,保存当前进程的状态并恢复下一个进程的状态,使其能够继续执行。 3. **系统时间...

    时间片轮转

    - **上下文切换(Context Switch)**:当时间片结束时,系统会保存当前进程的状态(即上下文),然后加载下一个进程的上下文,以便该进程可以继续执行。这一步骤涉及CPU寄存器和进程控制块(PCB)的更新。 #### 三...

    时间调度的设计与实现

    这被称为上下文切换(context switch),它涉及到保存当前任务的状态并恢复下一个任务的状态。 时间调度算法多种多样,可以根据不同的需求选择合适的策略。常见的有: 1. 先来先服务(First-Come, First-Served, ...

    进程切换分析(1):基本框架.pdf

    总的来说,进程切换在Linux中是一个复杂的过程,涉及到地址空间切换、硬件上下文切换以及各种资源的管理和同步。这个过程既要保证快速高效,又要确保数据一致性。本文的分析仅是进程切换的初步介绍,后续章节可能还...

    linux内核中的互斥问题讨论

    在这个过程中,会进行上下文切换(Context Switch),使得CPU可以继续执行其他任务。Semaphore的实现依赖于底层的原子操作,如Spinlock,以确保Semaphore数据结构的更新不会被中断。 Spinlock是另一种内核级的互斥...

    时间片轮转算法

    5. **上下文切换(Context Switch)**:当一个进程的执行时间片用尽时,系统会保存当前进程的状态,并加载下一个进程的状态,这一过程称为上下文切换。 #### 实现原理 1. **初始化**:创建一个节点结构体数组,每...

    KVM性能优化-美团开放服务.pdf

    1. Context Switch:上下文切换是虚拟机监控程序(VMM)和虚拟机(VM)之间的切换过程。为了提高性能,需要减少上下文切换的次数。Intel VT-x技术可以实现快速的上下文切换。 2. Cache:Cache是CPU中的高速缓存,...

    fpsimd.rar_V2

    描述 "FP SIMD context switching and fault handling for Linux v2.13.6." 提到的重点是浮点SIMD上下文切换和故障处理。浮点SIMD技术允许处理器同时处理多个浮点数据,显著提高计算密集型任务的效率,如图形渲染、...

    OS-时间片轮转调度算法.pdf

    在源程序中,`Dtime(int t)`函数可能是模拟时间流逝和进程切换的函数,`insert(PCB *p)`函数用于按照优先级将新进程插入到就绪队列中,而`CTProc`(可能是Context Switch,上下文切换)可能负责实际的进程调度逻辑,...

    操作系统\ CPU调度.pdf

    - **上下文切换 (Context Switching)**:保存当前进程的状态,并加载新进程的状态。 - **切换到用户态 (Switch to User Mode)**:将系统从内核态转换为用户态。 - **跳转至用户程序的正确位置 (Jump to the Proper ...

    java与zero-copy

    如果没有零拷贝技术,数据在传输过程中将多次跨越用户态和内核态的边界,每次跨越边界都需要一次上下文切换(context switch)和数据复制,这会导致CPU周期和内存带宽的消耗。而零拷贝技术恰好可以消除这些不必要的...

Global site tag (gtag.js) - Google Analytics