使用oprofile对软件做profiling

使用oprofile对软件做profiling,第1张

关于Xilinx Zynq-7000带来的新的系统设计思路,以及Profiling的对象libjpeg,前文已经描述过了,再此不再赘述。

一. Oprofile简介

Profiling是对不同性能特征的数据的形式化总结或分析,它通常以图形和表的形式出现。它提供为特定的处理器事件收集的采样百分数或数量,比如cache miss rate、TLB miss rate等等。一般来说,主要目的是为了找出软件中的性能瓶颈,然后有针对性的优化以提升软件的整体性能。

Oprofile 是用于 Linux 的若干种评测和性能监控工具中的一种。它可以工作在不同的体系结构上,包括ARM, PowerPC, MIPS, IA32, IA64 和 AMD Athlon等等。它的开销很小,从Linux 2.6 版起,它被包含进了Linux内核中。

Oprofile可以收集有关处理器事件的信息,帮助用户识别诸如循环的展开、cache的使用率低、低效的类型转换和冗余 *** 作、错误预测转移等问题。Oprofile是一种细粒度的工具,可以为指令集或者为函数、系统调用或中断处理例程收集采样。Oprofile 通过取样来工作。使用收集到的评测数据,用户可以很容易地找出性能问题。

通过监察CPU的hardware events,oprofile可以在运行状态下对整个Linux系统进行profiling。Profiling的对象可以是Linux kernel (包括modules和interrupt handlers), shared libraries或者应用程序。

从0.9.8版本开始,oprofile支持Perf_events profiling mode模式。应用程序operf被用来控制profiling过程;而在legacy mode下,是通过opcontrol脚本和oprofiled daemon来完成的。Operf不再象legacy mode那样需要OProfile kernel driver,它直接和Linux Kernel Performance Events Subsystem打交道。使用operf,就可以用普通用户的身份来profiling用户的应用程序了,当然如果需要对整个系统来profiling的时候还是需要root权限的。

如果硬件不支持OProfile使用performance counters,OProfile就只能工作在TImer Mode下了。TImer Mode只能在legacy profiling mode下使用,即只能通过opcontrol脚本来控制。

Oprofile的website为:
可以支持的处理器的hardware event类型:
对于Zynq-7000来说, 列出了ARM Cortex-A9内核PMU(Performance Monitor Unit)所支持的所有hardware event种类,可以看出oprofile可以支持很多深入处理器内部的分析。

提供了一些oprofile生成的结果,可以方便开发者在开始使用之前了解oprofile能够做到哪些事情。

Oprofile的详细使用文档:

Oprofile的优势:
Ÿ 比较低的运行开销
Ÿ 对被profiling的对象影响很小
Ÿ 可以profiling中断服务程序(interrupt handlers)
Ÿ 可以profiling应用程序和shared libraries
Ÿ 可以profiling dynamically compiled (JIT) code
Ÿ 可以对整个系统做profiling
Ÿ 可以观察CPU内部的细节,例如cache miss rate
Ÿ 可以多源代码做annotaTIon
Ÿ 可以支持instrucTIon-level的profiling
Ÿ 可以生成call-graph profiles

不过OProfile也不是万能的,它也有自己的局限性:
Ÿ 只能在x86, ARM, 和PowerPC架构上生成call graph profiles
Ÿ 不支持100%精确的instruction-level profiling
Ÿ 对dynamically compiled (JIT) code profiling的支持还不完善。

无论如何,Oprofile的功能都比gprof要强很多,代价是配置起来会比较麻烦。

二. 编译Oprofile

首先最好在Linux kernel里面选中Oprofile driver,以获得全面的支持。

下载Linux kernel Source:从 https://github.com/Xilinx/linux-xlnx 可以下载到Xilinx提供的验证好的内核。如果不方便使用Linux下的git工具,可以单击页面上的releases找到相应的版本下载tar ball。下载的时候最好选tar.gz格式的,而不是zip格式的,因为后者在处理symbol link的时候有可能会出问题。

因为笔者使用的是Xilinx Linux pre-built 14.7,所以这里下载的是 linux-xlnx-xilinx-v14.7.tar.gz

解压缩后,用以下命令调出Linux kernel的配置界面:
export ARCH=arm
export CROSS_COMPILE=arm-xilinx-linux-gnueabi-
make xilinx_zynq_defconfig
make xconfig 或者make menuconfig

在配置界面上将以下两项勾上:
General setup --->
[*] Profiling support
<*> OProfile system profiling

然后make uImage即可生成新的uImage,用来替换Xilinx Linux pre-built 14.7中的Linux kernel image。同时我们也需要vmlinux来检查profiling的结果。

Oprofile需要popt, bfd, liberty库,要在嵌入式单板上使用这些库,需要手工完成交叉编译。

针对popt 1.7,用以下命令完成编译:
./configure --prefix=/home/wave/xilinx/oprofileprj/rootfs --host=arm-xilinx-linux-gnueabi --with-kernel-support --disable-nls && make && make install

针对binutils 2.24,用以下命令完成编译:
./configure --host=arm-xilinx-linux-gnueabi --prefix=/home/wave/xilinx/oprofileprj/rootfs --enable-install-libbfd --enable-install-libiberty --enable-shared && make && make install
不过--enable-install-libiberty没有效果,所以需要手工把libiberty.a和libiberty.h拷贝到相应的位置。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2612661.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-10
下一篇 2022-08-10

发表评论

登录后才能评论

评论列表(0条)

保存