Chinaunix首页 | 论坛 | 博客
  • 博客访问: 386286
  • 博文数量: 39
  • 博客积分: 1771
  • 博客等级: 上尉
  • 技术积分: 1231
  • 用 户 组: 普通用户
  • 注册时间: 2005-05-01 14:21
文章分类

全部博文(39)

文章存档

2013年(1)

2012年(4)

2011年(16)

2010年(6)

2009年(12)

分类: LINUX

2011-09-28 15:34:46

Oprofile是一个很流行实用的profile工具,利用它我们可以查出系统的瓶颈并加以改进(它可以profile内核和应用程序)。这次记录我为TI DM36x平台配置oprofile的过程。

首先,oprofile需要内核的支持。先要配置内核:
# CC=arm-none-linux-gnueabi-gcc make menuconfig
然后将如下选项编入内核:
General setup  ---> 
[*] Profiling support (EXPERIMENTAL)
<*> OProfile system profiling (EXPERIMENTAL)
编译内核和文件系统,将他们烧写到设备上。如果之前已经编译了其他的驱动,这时也要重新编译,否则它们是不能加载的。

接下来交叉编译oprofile。
先下载最新的oprofile源代码:
解压,进入oprofile目录,执行
# CC=arm-none-linux-gnueabi-gcc CXX=arm-none-linux-gnueabi-g++ ./configure --host=arm --with-kernel-support 
# make
然后将下面的binary拷入设备的文件系统的/usr/bin下:
pp/opannotate
pp/oparchive
pp/opgprof
pp/opreport
daemon/oprofiled
utils/opcontrol
utils/ophelp
oprofile还依赖popt库。下载最新的popt库并交叉编译,然后将libpopt.so.0考到设备文件系统的/lib目录下。

这时候oprofile的配置就差不多完成了。oprofile的实用的命令大致有以下几个:
opcontrol --init
opcontrol --reset
opcontrol --no-vmlinux 或 opcontrol --vmlinux=/vmlinux, 取决于你是否要sample内核,vmlinux文件要在编译完内核后从内核的根目录拷贝过来。
opcontrol --start
run our program
opcontrol --dump
opcontrol --stop
opcontrol --shutdown

oprofile默认将sample出来的数据放在/var/lib/oprofile/目录下。sample结束后需要用opreport工具来提取并显示profile的结果。opreport主要的参数有-t和-l两个。
另外比较实用的命令是opannotate,可以根据sample显示源文件的那些地方执行的频率最多。当然前提是运行的应用程序或内核必须有调试符号。而且源文件必须存在在相应目录下,所以这个一般要配合nfs使用。opannotate典型的用法如下:
opannotate -s -o anno -t 1 /stream/bin/encode_stream

要额外指出的是,oprofile在嵌入式设备上用可能会有问题,sample出来的数据可能根本不能用opreport来分析。经过我调试发现是oprofile中使用了mmap系统调用,而且传递的flag是MAP_SHARED。而我们的jffs2文件系统不支持MAP_SHARED方式的mmap。解决方法有几个:
1. 用nfs rootfs来调试。
2. 每次使用oprofile前运行mount tmpfs /var/lib/oprofile/ -t tmpfs -o size=2M,将内存文件系统挂载到/var/lib/oprofile/下。
3. 每次运行opcontrol的时候加上--session-dir=dir参数,将sample数据保存到其他非jffs2文件系统的分区或目录上。

最后需要说明的是,如果想sample库函数(譬如说libc,libpthread),那么这些库也必须有调试信息,否则只能显示这个库的整体workload,而显示不出每个函数的workload。
阅读(2447) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~