一、概述

oprofile库是linux平台上的一个功能强大的性能分析工具,支持两种采样方式:基于事件的采样与基于时间的采样。

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

2)基于时间的采样是oprofile借助OS时钟中断的机制,每个时钟中断oprofile都会记录一次(采样一次),其精度相对于基于事件的采样要低。因为要借助OS时钟中断的支持,对禁用中断的代码oprofile不能对其进行分析。


oprofile在Linux上分为两部分,一个是内核模块(oprofile.ko),一个是用户空间的守护进程(oprofiled)。

1)oprofile.ko 负责访问性能计数器或者注册基于时间采样的函数(使用register_timer_hook注册之,使时钟中断处理程序最后执行profile_tick时可以访问之),并将采样置于内核的缓冲区内。

2)oprofiled在后台运行,负责从内核空间搜集数据,写入文件。


二、注意事项

1)不建议在虚拟机里利用oprofile来测试性能,因为虚拟机对oprofile支持不好。

2)调试的内核最好是原生的内核,发行版Linux(比如redhat)自带的内核一般都是经过大量修改的,对oprofile支持不好,所以我们最好从kernel官方网站下载源码后自行编译生成内核,重启机器对新内核环境进行性能测试。另外oprofile需要的是未经压缩的内核镜像,所以/boot目录的vmlinuz-x.x.xx是不能用的,而需要使用linux源码编译目录里的未压缩镜像文件,比如/usr/src/linux-2.6.30/vmlinux

3)需要添加内核配置文件

CONFIG_OPROFILE=m(或者y)

CONFIG_PROFILIING=y

一般内核将oprofile编译成模块,可以自行加载。在/lib/modules/3.xx.xx/kernel/arch/x86/oprofile下有oprofile.ko内核模块。


三、编译问题

oprofile-1.0.0,下载地址:​​http://sourceforge.net/projects/oprofile/files/oprofile/​

./configure make & sudo make install


1)提示:configure:error:popt library not found

下载popt-1.16,下载地址:​​http://www.linuxfromscratch.org/blfs/view/svn/general/popt.html​

./configure make & sudo make install

继续进入oprofile目录执行./configure


2)提示:configure:error: liberty library not found

下载binutils-2.25,下载地址:​​http://ftp.gnu.org/gnu/binutils/?C=M;O=D​

./configure --with-sysroots
make clean
make
sudo make install


3)提示:C compiler cannot create executables

删除/usr/local/bin/ld文件,删除之前做个备份,然后在执行上面“ 2)“的流程



4)继续进入到oprofile目录执行./configure

提示:configure:error:liberty library not found

该库也是在binutils中,在libiberty下,由于libiberty的configure没有提供--enable-shared选项,所以需要我们自己制作so文件,编辑Makefile,加上-fPIC编译选项,然后利用make gcc生成so:

cd libiberty //进入该目录
./configure //完成之后会有个Makefile文件产生
vi Makefile //编辑该文件,找到并修改该行为: CFLAGS = -g -O2 -fPPIC 保存
make clean
make
gcc -shared *.o -o libiberty.so //生成.so文件,把该文件拷到/usr/lib中
sudo cp libiberty.so /usr/lib/libiberty.so


最后还需要bfd的动态链接库,也是在binutils中,在bfd中,由于自带的configure可以加入--enable-shared,所以可以利用该参数自动生成.so文件到/usr/lib中

cd bfd
./configure --enable-shared
make clean
make
sudo make install

其实最后生成的libbfd-2.25在/usr/local/lib目录下,需要通过export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib指定libbfd-2.25库的位置,方便oprofile的一些应用程序能够找到动态链接库。


最后回到oprofile目录中再安装一遍:

./configure
make clean
make
sudo make install



转载的几个网址:


​http://blog.chinaunix.net/uid-13746440-id-3152484.html​