本文共 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/