source性能分析工具Oprofile详细解析

Oprofile Introduction


内容概要

* oprofile 介绍

* .oprofile 安装及 Linux 内核编译

* oprofile 使用

* oprofile 实例演示及性能分析

* gprof 介绍

* Kprof 分析

* gcov 简介

 

一、 oprofile 介绍

      oprofile Linux 平台上,类似 INTEL VTune 的一个功能强大的性能分析工具。 其支持两种采样 (sampling) 方式:基于事件的采样 (event based) 和基于时间的采样 (time based)

      基于事件的采样是 oprofile 只记录特定事件(比如 L2 cache miss )的发生次数,当达到用户设定的定值时 oprofile 就记录一下(采一个样)。这种方式需要 CPU 内部有性能计数器 (performace counter) 。现代 CPU 内部一般都有性能计数器;

      基于时间的采样是 oprofile 借助 OS 时钟中断的机制,每个时钟中断 oprofile 都会记录一次 ( 采一次样)。引入的目的在于,提供对没有性能计数器 CPU 的支持。其精度相对于基于事件的采样要低。因为要借助 Os 时钟中断的支持,对禁用中断的代码 oprofile 不能对其进行分析。

      oprofile Linux 上分两部分,一个是内核模块 (oprofile.ko) ,一个为用户空间的守护进程 (oprofiled) 。前者负责访问性能计数器或者注册基于时间采样的函数 ( 使用 register_timer_hook 注册之,使时钟中断处理程序最后执行 profile_tick 时可以访问之 ) ,并采样置于内核的缓冲区内。后者在后台运行,负责从内核空间收集数据,写入文件。

 

二、 oprofile 安装及 Linux 内核编译


I. Oprofile 安装

Oprofile 包含在 Linux 2.6 版本的内核中,是用于 Linux 的若干种评测和性能监控工具中的一种。 也可从官方网站下载源码进行编译安装;具体安装步骤:

1. ./configure --with-kernel-support

注:在编译过程中,这一步出现的问题是:

1 )缺少 libiberty.h 头文件 ; 2 )缺少 popt

libiberty.h 头文件在 binutils-devel package 中,需要下载这个包进行安装;也可通过新立德 进行安装。可以用 sudo apt-get install binutil-dev 进行包安装。 Popt 存在 libpopt-devel package 中,同样需要进行下载安装; sudo apt-get install libpopt-dev;

 2. make

 3. make install

oprofile 安装完成后会生成以下工具集:

 /usr/bin/oprofiled 守护进程
/usr/bin/opcontrol
控制前端,负责控制与用户交互,用得最多
/usr/bin/opannotate
根据搜集到的数据,在源码或者汇编层面上注释并呈现给用户
/usr/bin/opreport
生成二进制镜像或符号的概览
/usr/bin/ophelp
列出 oprofile 支持的事件
/usr/bin/opgprof
生成 gprof 格式的剖析数据


opstack : 产生调用图 profile ,但要求 x86/2.6 的平台,并且 linux2.6 安装了 call-graph patch

oparchive : 将所有的原始数据文件收集打包,可以到另一台机器上进行分析。
op_import
: 将采样的数据库文件从另一种 abi 转化成本地格式。

运行 oprofile 需要 root 权限,因为它要加载 profile 模块,启动 oprofiled 后台程序等。所以在运行之前, 就需要切换到 root


II. Linux 内核编译

由于 oprofile 是可对内核进行评测和性能监控的工具,所以需要有内核支持。但是在 ubuntu 下面并没有内核源码,所以需要下载本机对应版本的内核源码,进行编译安装;

编译新内核的步骤如下:

( 1 )将下载的内核放在 /usr/src 目录下;进行解压: tar -jxvf linux-source-2.6.27.tar.bz2;

(2 )接下来对内核进行配置: make menuconfig(or make xconfig), 我选择使用此命令;

在进行配置过程中 ,General Setup 中的 Local version - append to kernel release 是可以自己 定制自己喜欢的内核名字 ; Load an Alternate Configuration File 此选项可以引用系统中的配置文件; Save an Alternate Configuration File 是将重新配置的 .config 文件进行保存。 在配置之前,可以用以下命令进行清除。 Make clean :可以把以前编译的文件进行清除;

Make mrproper : 可以清除以前的配置文件;建议新手不用;最好对以前的 .config 文件进行配置。

 

.config 文件是内核源码中自带的 ./usr/src/linux-source-2.6.27/arch/x86/configs

面的 config 文件再根据 menuconfig 中的选项进行裁减后获得的最终的 config 文件。

(3) make 进行内核编译,编译完成后会在 /boot 目录下生成几个重要的文件; vmlinuz-2.6.27 System.map 等;其中 config 文件生成在 /linux-source-2.6.27 目录下,需要拷贝到 /boot 目录下面。

( 4 make modules_install 安装配置中选定的模块。

( 5 make install

( 6 )检查是否生成 initrd 镜像文件,在 ubuntu 下并没有生成,需要在 /boot 下面使用命令:

mkinitramfs -o initrd.img.2.6.27.18 生成镜像文件。

( 7 )在 /boot/grub 下面编辑 menu.lst 文件,按照格式将新内核信息进行添加;只有在此处对新内核 添加,系统启动后才会被引导进入新内核。如果配置符合系统要求,按照这个顺序就可以编译一个新内核了。

 

三、 oprofile 使用

oprofile 要在 root 权限下使用:

a. 初始化

opcontrol --init

该命令会加载 oprofile.ko 模块, mount oprofilefs 成功后会在 /dev/oprofile/ 目录下导出些文件和目录如: cpu_type, dump, enable, pointer_size, stats.

b. 配置

1. 首先,配置 OProfile 是否应该监视内核。这是在启动 OProfile 前需要的配置选项。

以及对计数事件和样本计数的设置,计数的 CPU 模式(用户态、核心态)是系统默认项;

如果 oprofile 监视评测内核自身:

opcontrol –vmlinux=/src/urc/linux-source-2.6.27/vmlinux

如果 oprofile 不用监视评测内核:

opcontrol --no-vmlinux .

在此体系结构 Family10h 中默认的配置为:

opcontrol –event=CPU_CLK_UNHALTED:100000

如果配置守护进程写入文件的方式,用以下命令:

opcontrol --separate=<choice>

<choice> 可以是以下之一:

none — 不要分离档案(默认)

library — 为库生成每个应用程序的档案

kernel — 为内核和内核模块生成每个应用程序的档案

all — 为库生成每个应用程序的档案,为内核和内核模块生成每个应用程序的档案

 

注意问题:

1 oprofile 可以在此进行事件设置;

通过 opcontrol --list-events 命令可以查看此结构中支持的事件;

通过 opcontrol --event=L2_CACHE_MISS:500 --event=L1_DTLB_MISS_AND_L2_DTLB_HIT:500

--event=......... 命令来进行事件的设置;

此命令 --event 参数必须依次给出,无论有多少个,不可分行,切记!

通过 opcontrol –status 命令可以查看自己已经配置的事件;

 

2 )对于每一次测试过程中,如果需要进行事件的重新设置,就必须重启 daemon, 它是

一个守护进程。也就是说,收集数据完成后,要用 --shutdown 命令来停止 daemon, 而不是 -- stop( 此命令只是停止 profiling) ,这样再次进行— start 命令就可以使用新的事件设置;

3 )一次评测结束后,旧的 profiling data 还是存在的,用— reset 或者— save 命令来清理或者保存数据;

 

c. 启动

opcontrol --start

d. 运行待分析之程序

gcc -o wls wls.c ;生成 wls.o 文件; ./wls

e. 取出数据

opcontrol –dump

数据被写进 /var/lib/oprofile/samples /oprofiled.log

f. 停止评测

opcontrol --stop

g. 使用 opreport 分析结果

opreport -l ./wls

根据设置的事件进行评测,将评测的结果一一显示出来。

 

h. 使用 opannotate 分析结果

如果对源码进行分析,可以通过 opannotate 工具实现

编译: gcc -g wls.c -o wls

分析: opannotate --source ./wls

 

总结一下:

  1. opcontrol –init 加载模块, mout /dev/oprofile 创建必需的文件和目录

  2. opcontrol --no-vmlinux 或者 opcontrol --vmlinux=/boot/vmlinux-`uname -r` 决定是否对 kernel 进行 profiling

  3. opcontrol --reset 清楚当前会话中的数据

  4. opcontrol --start 开始 profiling

  5. ./wls 运行应用程序, oprofile 会对它进行 profiling

  6. opcontrol --dump 把收集到的数据写入文件

  7. opcontrol --stop 停止 profiling

  8. opcotrol -h 关闭守护进程 oprofiled

  9. opcontrol --shutdown 停止 oprofiled

  10. opcontrol --deinit 卸载模块

常用的是 3→7 这几个过程,得到性能数据之后,可以使用 opreport, opstack, opgprof, opannotate几个工具进行分析,我常用的是 opreport, opannotate 进行分析。

 

 

四、实例演示

下面以 AMR 的解码源码为例,来分析代码的性能。

首先,要对即将分析的代码进行编译:

(1) 编译源代码的库文件:

在目录 /home/wls/ 应用软件 /AMREngineC_OKI_source/AMRDecEngine 下执行 make 命令; 生成文件: libAMRDecEngine.a 此文件为归档库文件。

2 )编译源代码的主文件:

在目录 /home/wls/ 应用软件 /AMREngineC_OKI_source/TestAMRDec/Win32 下执行 make 命令; 生成文件: TestAMR 此文件为可执行文件。

TestAMR 复制到上层目录: cp TestAMR ..

执行命令: ./TestAMR AMRDec.par 生成 TestAMRDec.wav

其次,执行 oprofile 的命令并进行相应设置:

root@wls-desktop:~/TestAMRDec# opcontrol --init

root@wls-desktop:~/TestAMRDec# opcontrol --no-vmlinux

root@wls-desktop:~/TestAMRDec# opcontrol --event= CPU_CLK_UNHALTED:5000

--event=DATA_CACHE_MISSES:1000 --event=INSTRUCTION_CACHE_MISSES:1000

--event=MEMORY_REQUESTS:1000

root@wls-desktop:~/TestAMRDec# opcontrol --status

Daemon running: pid 14979

Event 0: CPU_CLK_UNHALTED:5000:0:1:1

Event 1: DATA_CACHE_MISSES:1000:0:1:1

Event 2: INSTRUCTION_CACHE_MISSES:1000:0:1:1

Event 3: MEMORY_REQUESTS:1000:131:1:1

Separate options: none

vmlinux file: none

Image filter: none

Call-graph depth: 0

root@wls-desktop:~/TestAMRDec# opcontrol –start

Using 2.6+ OProfile kernel interface.

Reading module info.

Using log file /var/lib/oprofile/samples/oprofiled.log

Daemon started.

Profiler running.

root@wls-desktop:~/TestAMRDec# ./TestAMR AMRDec.par

 

===================================================

Audio Length [msec] : 10020

Audio Frames [frame] : 501

Audio Packets [packet] : 501

Decoded Bytes [byte] : 7014

Average Bitrate [kbps] : 5.600

Decoding Time [msec] : 40 (250.500 Times)

===================================================

root@wls-desktop:~/TestAMRDec# opcontrol --dump

root@wls-desktop:~/TestAMRDec# opcontrol --stop

Stopping profiling.

root@wls-desktop:~/TestAMRDec# opreport -l ./TestAMR

数据分析结果如下:

codecperformance

 

如果设置如下:

root@wls-desktop:~/TestAMRDec# opcontrol –vmlinux=/src/urc/

linux-source-2.6.27/vmlinux

withkernel 

root@wls-desktop:~/TestAMRDec# opcontrol --shutdown

Stopping profiling.

Killing daemon.

 root@wls-desktop:~/TestAMRDec# opcontrol --deinit

Daemon not running

Unloading oprofile module

 

现将 oprofile 用到的各种性能参数在此予以解释:

 通过 op_help 或者 opcontrol –list-events 显示出 oprofle

  • 0
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值