文档章节

如何测量上下文切换时间

一贱书生
 一贱书生
发布于 2016/11/25 09:27
字数 2073
阅读 17
收藏 0
点赞 0
评论 0

LINUX查看指定进程的Context Switch上下文切换:pidstat

Context Switch(CS)上下文切换是cpu性能中的一个重要指标,context switch过高会导致CPU像个搬运工,频繁在寄存器和运行队列之间奔波  ,更多的时间花在了线程切换,而不是真正工作的线程上。

linux中一般使用vmstat监控系统上下文切换,pidstat监控指定进程的上下文切换。

pidstat监控指定进程的Context Switch上下文切换:

首先安装sysstat:yum install sysstat  //使用的是fedora,ubuntu/debian使用apg-get

pidstat -w -G testp 1 10       //根据进程名监控上下文切换
pidstat -w -p 48863 1 10     //根据PID监控上下文切换

平均时间: UID    PID       cswch/s     nvcswch/s   Command
平均时间: 0         48770     2.53          2.78               testp

cswch/s: 每秒任务主动(自愿的)切换上下文的次数,当某一任务处于阻塞等待时,将主动让出自己的CPU资源。

nvcswch/s: 每秒任务被动(不自愿的)切换上下文的次数,CPU分配给某一任务的时间片已经用完,因此将强迫该进程让出CPU的执行权。

多处理器时添加-I参数,显示各个cpu的使用率,如pidstat -w -I -G testp 1 10

什么是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.cnblogs.com/EthanCai/p/3705834.html

© 著作权归作者所有

共有 人打赏支持
一贱书生
粉丝 19
博文 723
码字总数 600072
作品 0
第一章-并发编程的挑战

并发编程目的是让程序运行的更快。并不是启动更多的线程就能让程序最大限度的执并发执行。并发编程时,如果想通过多线程执行任务让程序执行的更快,会有很多挑战。比如: 上下文切换问题 死锁...

jEpac
2016/07/29
19
0
Java并发专题 并发编程的优缺点

一直以来并发编程对于刚入行的小白来说总是觉得高深莫测,于是乎,就诞生了想写点东西记录下,以提升理解和堆并发编程的认知。为什么需要用的并发? 凡事总有好坏两面,之间的trade-off是什么...

技术小能手
07/12
0
0
Linux内核自旋锁

Linux自旋锁 Linux内核中最常见的锁是自旋锁(spin lock)。自旋锁最多只能被一个可执行的线程持有。如果一个执行线程试图获得一个被已经持有(即所谓的争用)的自旋锁,那么该线程就会一直进...

秋风醉了
2015/08/30
71
0
[CareerCup] 16.2 Measure Time in a Context Switch 测量上下文转换的时间

16.2 How would you measure the time spent in a context switch? 上下文转换发生在两个进程之间,比如让一个等待进程进入执行和让一个运行进程进入等待,这些在多任务中发生。操作系统需要...

机器的心脏
2017/12/14
0
0
【Java并发性和多线程】多线程的代价

本文为转载学习 原文链接:http://tutorials.jenkov.com/java-concurrency/costs.html 译文链接:http://ifeve.com/costs-of-multithreading/ 从一个单线程的应用到一个多线程的应用并不仅仅...

heroShane
2014/01/28
0
0
3、Java并发性和多线程-多线程的代价

以下内容转自http://ifeve.com/costs-of-multithreading/: 从一个单线程的应用到一个多线程的应用并不仅仅带来好处,它也会有一些代价。不要仅仅为了使用多线程而使用多线程。而应该明确在使...

easonjim
2017/06/14
0
0
说说你对阿姆达尔定律的了解?

阿姆达尔定律是用来表示处理器平行运算后效率提升的能力。T(N)=B + (T-B)/N 其中B为不可平行运算的时间,T为运算需要的总时间,N为线程或者CPU数,那么T(N)为并行因子为N时的执行时间的总时间...

nj-zhangmq
2016/12/09
3
0
linux 系统性能调优

CPU介绍NUMA(Non-Uniform Memory Access,非一致性内存访问)和SMP(Symmetric Multi-Processor,对称多处理器系统)是两种不同的CPU硬件体系架构 总核数 = 物理CPU个数 X 每颗物理CPU的核数 总...

雪地花露
2016/12/06
0
0
理解性能提升By阿姆达尔定律(Amdahl's law)

我们在进行系统优化完成后,怎么评估优化的效果呢?最简单的方式是测量系统优化后耗时和优化前耗时的比例,这也叫加速比S(Speed Up)。 阿姆达尔定律在理解性能优化具有重要指导意义。优化前系...

HappyBoyLi
06/26
0
0
系统性能指标查看方法-Linux

一、监控CPU使用率 1、 Linux提供了监控CPU使用率的命令行工具,可以保留文本形式的CPU使用率运行历史和日志。常用的命令有:vmstat、mpstat、top等等,下面只是top命令的一个截图,其他的命...

K_ONE
2016/11/26
186
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

istio源码分析之pilot-discovery模块分析

本文分析的istio代码版本为0.8.0,commit为0cd8d67,commit时间为2018年6月18日。 本文为Service Mesh深度学习系列之一: Service Mesh深度学习系列part1—istio源码分析之pilot-agent模块分...

xiaomin0322
11分钟前
0
0
数据库基本操作:增删改查及联表操作

所用软件:SQL Server Management Studio 首先第一步,建立一个表。在这里命名为T1。并在里面填入几条数据。如图: T1 一.查询 查询所有:select * from T1; 按条件查询:select * from T1 ...

小_橙_子
15分钟前
0
0
Crontab作业时间设置

今天,遇到这么一个题目,周一到周五的9:00-16:59之间,每隔两分钟将某个命令运行一次。给的答案是: */2 9-16 * * 1-5 /usr/sbin/somecommand dosomething 乍一看,这个答案不对,应...

大别阿郎
19分钟前
0
0
ES17-JAVA API文档管理

1.保存文档 可以通过json工具把java对象转换成json字符串进行保存,也可以通过内置的帮助类直接构建json格式 /** * 获取客户端 * * @return */public static TransportClie...

贾峰uk
20分钟前
0
0
Python代码规范和命名规范

前言 Python 学习之旅,先来看看 Python 的代码规范,让自己先有个意识,而且在往后的学习中慢慢养成习惯 一、简明概述 1、编码 如无特殊情况, 文件一律使用 UTF-8 编码 如无特殊情况, 文件头...

blackfoxya
23分钟前
0
0
联动滑动之一:NestScrollChild和NestedScrollingParent

NestScrollChild和NestedScrollingParent 吐槽一下开源中国竟然标题字数有限制 由于项目中使用了CoordinateLayout来解决联动以及实现炫酷的UI效果,那么必须就要研究一波源码了,毕竟知其然知...

JerryLin123
40分钟前
1
0
cloudera spark2.2 读写hbase

cloudera spark2.2 读写hbase 例子 host = 'bigdata-03,bigdata-05,bigdata-04'conf = { "hbase.zookeeper.quorum": host, "hbase.mapreduce.inputtable": "student1"}k......

osenlin
45分钟前
0
0
数据库规范化

转载自 一个小时学会MySQL数据库 地址:http://www.cnblogs.com/best/p/6517755.html 截取其中 1.4 部分 用于自己学习使用 感谢作者:张果 1.4、数据库规范化 经过一系列的步骤,我们现在终于...

十万猛虎下画山
45分钟前
0
0
ios逆向之工具篇

Reveal:查看任意app的UI结构 注:1.不越狱的手机,可以用Reveal来查看自己app的UI结构,不能查看其它app的结构。 2.越狱手机上可以查看任意app的UI结构。 IDA:反编译工具 从App Store下载的...

HeroHY
46分钟前
0
0
EOS区块链平台智能合约示例HelloWorld

我们将介绍一个使用EOS智能合约构建hello World的例子。 一般环境设置通过上一篇文章已经说明,这方面的问题大家可以看本博客上一篇文章,本文引用了官方EOS在Git上的示例。 运行nodeos 要通...

笔阁
48分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部