安装oprofile的主要目的是观察mapreduce程序在CPU事件这个层次表现出的特征,对比了几个常见工具,最终确定利用operf来进行数据采集。Operf的特征是可以用非root用户profile单进程,并且有效作用于该进程中的任何线程和用fork产生的子进程。
operf是0.9.8版出现的新工具,可能存在bug,
稳定版下载页面 http://oprofile.sourceforge.net/download/
最新源代码下载 git clone git://oprofile.git.sourceforge.net/gitroot/oprofile/oprofile
popt 命令行参数解析
libiberty GNU libiberty is a software library with a collection ofsubroutines used by variousGNUprograms.
wiki上有详细解释,http://en.wikipedia.org/wiki/Libiberty
bfd Binary File Descriptor library
其中libiberty可以单独下载,也可以在binutility中找到,
1 首先,解压OProfile.0.9.8.tar.gz, 运行autogen.sh
2 再运行 configure,
这个过程会分别提示缺少库popt,libiberty,bfd,分别安装即可;
对java程序的支持 --with-java=(java安装路径),
对内核和模块的支持 --with-kernel=(内核头文件路径)
一般情况下configure的最终语句应该为 ./configure --with-java=/home/simon/java/current --with-kernel=/usr/src/linux-headers-3.2.0-29
3 make
检查make的结果,应该生成两个动态库,分别是libjvmti_oprofile.so,libopagent.so,如果没有生成动态库,在configure时加入
--enable-shared选项。同时operf应该位于子目录pe_profiling下。
4 make install
用root用户安装,默认情况下的安装路径是/usr/local/lib/oprofile
在hadoop安装目录下,脚本文件$HADOOP_HOME/bin/hadoop, 最前面添加以下两个语句
OPROFILE_OPTS=" -agentpath:/usr/local/lib/oprofile/libjvmti_oprofile.so "
HADOOP_OPTS="$OPROFILE_OPTS"
(此处并非唯一方法,理论上凡是java程序启动并且可以添加启动参数的地方均可修改)
operf -p “目标进程号” --vmlinux="当前系统未压缩内核所在路径" -e “CPU事件名:采样频率”
例如运行语句:监控tasktracker进程在执行某特定workload的特征,本例监测以下两个CPU事件,
operf -p 24057 -e CPU_CLK_UNHALTED:6000,INST_RETIRED:6000
opreport获取结果如下图:
间隔时间执行opreport语句并保存结果到,在运行某特定workload这段时间内获取信息即可描述,CPU事件在此时间序列上的分布,进一步挖掘多个workload在这个层次上的差异。
1 在执行configure oprofile过程中,依赖包已经安装,但是任然提示缺少某库,可能是因为编译依赖库未产生动态库导致,安装依赖库时添加 --enable-shared 选项,
2 提示找不到 jvmti.h文件,注意给出java的安装路径,
3 提示找不到operf_events.h 注意给出内核头文件安装路径,若当前系统安装内核头文件,默认应该在/usr/include路径下
4 运行operf 获取不到已经运行的目标java进程的任何信息,详细请见
http://sourceforge.net/tracker/?func=detail&aid=3603034&group_id=16191&atid=116191
用git方式获取的源代码已经解决此问题
http://oprofile.sourceforge.net/faq/