2019独角兽企业重金招聘Python工程师标准>>>

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

转载于:https://my.oschina.net/u/2822116/blog/794014

如何测量上下文切换时间相关推荐

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

    什么是CPU上下文切换?css 如今linux是大多基于抢占式,CPU给每一个任务必定的服务时间,当时间片轮转的时候,须要把当前状态保存下来,同时加载下一个任务,这个过程叫作上下文切换.时间片轮转的方 ...

  2. 任务调度与上下文切换时间测试

    创建两个进程(实时进程)并在它们之间传送一个令牌,如此往返传送一定的次数.其中一个进程在读取令牌时就会引起阻塞.另一个进程发送令牌后等待其返回时也处于阻塞状态.发送令牌带来的开销与上下文切换带来的开销 ...

  3. Linux内核tcp时间测量,linux内核 – 测试linux内核中函数的执行时间

    我使用Linux安全模块挂钩来添加一些自定义功能到recv()系统调用.与原始的recv()相比,我想测量这个功能的开销.我写了一个简单的tcp服务器,我运行与没有我的模块.这个tcp服务器调用rec ...

  4. 测量在Python中经过的时间

    我想要的是开始在我的代码中的某个地方开始计时,然后获取经过的时间,以衡量执行少量功能所花费的时间. 我认为我使用的timeit模块错误,但是文档对我来说却很混乱. import timeitstart ...

  5. 如何测量FMCW扫频的时间

    目录 FMCW信号形式与雷达结构 用测距的方式测量TChirpT_{Chirp}TChirp​ FMCW雷达的信号频率随时间线性变化,扫频的周期TChirpT_{Chirp}TChirp​和频率的带宽 ...

  6. 专业测量串口收发数据时间软件

    大家如果做过和硬件设备进行通讯时,可能遇到最大的问题,如何获得计算机和设备之间的通讯数据和通讯时间,其中最关键的是要了解数据从发送到返回时两者之间用到最大的时间,这样才能最大速度来获得数据,本软件就是 ...

  7. 并发编程合集(1)上下文切换详解、死锁及解决方案详解

    目录 <Java 并发编程的艺术>第1章--介绍Java并发编程的挑战 1.1 上下文切换 1.1.1 多线程一定快吗 1.1.2 测试上下文切换次数和时长 1.1.3 如何减少上下文切换 ...

  8. 一篇文章带你「重新认识」线程上下文切换怎么玩儿

    调度 当一个计算机是多道程序设计系统时,会频繁的有很多进程或者线程来同时竞争 CPU 时间片.当两个或两个以上的进程/线程处于就绪状态时,就会发生这种情况.如果只有一个 CPU 可用,那么必须选择接下 ...

  9. #时间预测算法_改进的智慧交通系统出行时间预测算法

    引用 Chowdhury N K, Leung C K S. Improved travel time prediction algorithms for intelligent transporta ...

最新文章

  1. 如何扩展以太坊:分片
  2. java监听某端口和ip_Java 通过Socket监听指定服务器(IP)的指定端口,及向指定服务器的指定端口发送信息...
  3. Java程序员:不要因未知而让云成本大涨
  4. Android Studio经常使用配置及使用技巧(二)
  5. 01.QT中点击弹出新页面
  6. (万里开源)greatdb mysql 8.0以上版本创建用户并授权远程连接
  7. 2015 NI 校招笔试机试面试
  8. 微信团购小程序怎么做?一般要多少钱?
  9. 产品补丁包测试的基本流程
  10. 易鲸捷首架刘明:Trafodion值得放入工具箱,因为有以下优点
  11. Matlab中的ttest2()函数实现
  12. html中禁止网页另存为、查看源文件、屏蔽鼠标右键
  13. 【语音识别】基于MFCC的GMM实现语音识别matlab源码
  14. 跟着Nature学作图:最强“ 颠覆性 ”技术,您确定不学学?助力发Nature顶刊!...
  15. class6--tensorflow:滑动平均
  16. html5 语音导航,百度地图个性化语音导航:用声音表心意
  17. 爬山搜索法c语言代码,搜索算法--爬山法 (代码示例)
  18. 厚颜无耻的免费使用Visio和project2016
  19. 怎样写权利要求书(原创)
  20. 关于 ‘builtin_function_or_method‘ object has no attribute ‘set_colorkey‘和 No video mode has been set解释

热门文章

  1. ava返回json格式的状态码数据(一)
  2. Jenkins的入门(二)配置
  3. Requirejs与r.js打包,AMD、CMD、UMD、CommonJS、ES6模块化
  4. PCL:解决PCL和OpenCV冲突的方法
  5. java获取浏览器版本号
  6. Spring MVC 启动
  7. linux系统ftp服务器详解
  8. Logback 专题
  9. webstrom 中 plugins error 设置里 Languages Frameworks里面没有JavaScript?
  10. 菲波拉契数列(传统兔子问题)