博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oprofile的使用
阅读量:4056 次
发布时间:2019-05-25

本文共 2148 字,大约阅读时间需要 7 分钟。

本文介绍的是>=1.0.0版本的,以前的opcontrol是之前的版本,现在不推荐使用。

1.0.0版本之后使用的是operf, opreport, opannotate.

文档官方地址:

oprofile是一系列性能监视工具集,包含operf, opreport, opannotate等工具。它依赖于硬件的”performance counter”。oprofile需要你的linux版本不低于2.6.31,内核的配置项:

root@host:~/Public/h1shao/operf_test# cat /boot/config-`uname -r` | grep OPROFILE

CONFIG_OPROFILE=m

# CONFIG_OPROFILE_EVENT_MULTIPLEX is not set

CONFIG_HAVE_OPROFILE=y

CONFIG_OPROFILE_NMI_TIMER=y

oprofile支持的architechture为AMD, ARM, Intel, PowerPC, Tile, MIPS。

oprofile的运行依赖的lib有popt, bfd, liberty.

安装install:

1. git clone git://git.code.sf.net/p/oprofile/oprofile

2. ./configure [options]

3. make

4. make install

ubuntu安装时可能提示缺少包popt&libiberty, 这两个库分别在包libpopt-dev和libiberty-dev中,使用sudo apt-get install libiberty-dev libpopt-dev安装。

此外,还需要有oprofile:oprofile用户和用户组,可以使用”useradd -d /home/oprofile oprofile”命令添加。

operf

operf是一个用于监视的工具,监视的事件可以指定,也可以使用程序默认的配置事件。使用方法如下:

operf [ options ] [ --system-wide | --pid=<PID> | [ command [ args ] ] ]

例子:

1.监视整个系统       operf –system-wide

2.监视某个已经运行的程序     operf --pid=1234

3.启动并监视某个程序       operf ./test

4.使用指定事件

        operf --events cpu_clk_unhalted:2000003:"thread":0:1,l1d_pend_miss:2000003:"pending":0:1,dtlb_store_misses:2000003:1:0:1,l2_rqsts:2000003:0xff:0:1 ./test

事件的格式为: name:count[:unitmask[:kernel[:user]]]

name表示事件名

count表示事件发生这些次数后采样一次

unitmask进一步说明事件,可以通过ophelp来查看当前机器支持的事件和unit_mask,当unit_mask的数字编码不唯一时,需使用name,比如上述例子中的”thread”等。

kernel:表示是否收集kernel空间事件,0-disable, 1-enable

user:表示是否收集user空间事件,0-disable, 1-enable

operf需要运行一定时间才能有oprofile_data,否则是空的,使用opreport将提示没有oprofile data.

opreport用于将收集到的二进制事件数据转换为人类可理解和阅读的报告,并输出。

opannotate用于产生代码级别的性能监视报告,由于硬件的delay,会导致匹配代码行不准确,只作为一个参考,具体的见下面的工作原理中的说明。

oprofile的工作原理:

当使用operf配置事件后,PMC(physical performance monitor counter)被配置了,它就会去计数指定的事件,当指定事件的发生次数达到配置的次数count后(overflow),将触发一个PMC的不可屏蔽中断NMI,对应的中断处理程序中,将记录PC和task等信息到profile结构。由于使用的是NMI中断,所以普通的非NMI中断代码也可以被profiling.

由于计数溢出overflow和触发中断之间有一个delay,会导致pc等信息不准确,故opannotate的输出只是作为一个参考,并不一定100%匹配代码行。

 

最后是我自己本地做的一个operf学习例子:

测试源码:

要使用opannotate,编译时需加上”-g”选项。

使用operf命令监视测试程序时,时间要长,我大概跑了10几分钟。

使用opreport将监视事件转换为人类可阅读的数据。

1. 如果使用operf时时间不够长就ctrl + c了,那么将出现如下情况:

2. 时间足够长是,opreport将产生如下输出:

使用opannotate来注释代码:

注释代码的位置:

转载地址:http://vtlci.baihongyu.com/

你可能感兴趣的文章
linux irqdebug
查看>>
git 常用命令
查看>>
linux位操作API
查看>>
uboot start.s文件分析
查看>>
没有路由器的情况下,开发板,虚拟机Ubuntu,win10主机,三者也可以ping通
查看>>
本地服务方式搭建etcd集群
查看>>
安装k8s Master高可用集群
查看>>
忽略图片透明区域的事件(Flex)
查看>>
忽略图片透明区域的事件(Flex)
查看>>
AS3 Flex基础知识100条
查看>>
Flex动态获取flash资源库文件
查看>>
01Java基础语法-16. while循环结构
查看>>
01Java基础语法-19. 循环跳转控制语句
查看>>
Django框架全面讲解 -- Form
查看>>
今日互联网关注(写在清明节后):每天都有值得关注的大变化
查看>>
”舍得“大法:把自己的优点当缺点倒出去
查看>>
[今日关注]鼓吹“互联网泡沫,到底为了什么”
查看>>
[互联网学习]如何提高网站的GooglePR值
查看>>
[关注大学生]求职不可不知——怎样的大学生不受欢迎
查看>>
[关注大学生]读“贫困大学生的自白”
查看>>