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

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

文档官方地址: https://oprofile.sourceforge.io/doc/index.html

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来注释代码:

注释代码的位置:

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐