转 Linux调优工具oprofile的演示分析 linux性能分析与调优

耳闻oprofile很久,同学、同事也用了很久,看过很多oprofile的分析结果,一直没自己用过。刚好最近写paper需要分析程序的热点,花了一天来学。转载几篇实用的博文,留用。


《Linux调优工具oprofile的演示分析》

oprofile是最近添加到Linux内核的一个内部数据统计功能.


一)用opcontrol控制profile要打开oprofile,需要用start选项来调用opconrol,当第一次调用opcontrol时,必须告诉它想统计内核还是用户空间数据.因为我们的例子是在用户空间工作,应该用--no-vmlinux选项来取消内核统计,如下:
opcontrol --start --no-vmlinuxUsing default event: CPU_CLK_UNHALTED:100000:0:1:1Using 2.6+ OProfile kernel interface.Using log file /var/lib/oprofile/samples/oprofiled.logDaemon started.Profiler running.

每次启动都会在/root/.oprofile/目录下生成一个配置文件daemonrc,如下:
cat /root/.oprofile/daemonrcSESSION_DIR=/var/lib/oprofileNR_CHOSEN=0SEPARATE_LIB=0SEPARATE_KERNEL=0SEPARATE_THREAD=0SEPARATE_CPU=0VMLINUX=noneIMAGE_FILTER=CPU_BUF_SIZE=0CALLGRAPH=0XENIMAGE=none
注:以上的每个配置项是通过启动oprofile时加的参数生成的.
我们看一下oprofile进程,如下:ps -ef|grep oprofileroot3067310 22:02 ?00:00:00/usr/bin/oprofiled --session-dir=/var/lib/oprofile --separate-lib=0--separate-kernel=0 --separate-thread=0 --separate-cpu=0--events=CPU_CLK_UNHALTED:60:0:100000:0:1:1, --no-vmlinux
接下来我们用--dump选项告诉oprofiled输出统计量,如下:opcontrol --dump
再下来我们就可以用opreport,opgprof或者opannotate来观察它们,任何用户都可以看到输出,下面我们用opreport来查看统计量,如下:opreportOverflow stats not availableCPU: Core 2, speed 1203 MHz (estimated)Counted CPU_CLK_UNHALTED events (Clock cycles when not halted)with a unit mask of 0x00 (Unhalted core cycles) count 100000CPU_CLK_UNHALT...|samples|%|------------------12551.0204 no-vmlinux187.3469 libpthread-2.11.1.so176.9388 libc-2.11.1.so145.7143 libxul.so93.6735 libglib-2.0.so.0.2400.193.6735 VBoxVMM.so72.8571 libQtCore.so.4.6.262.4490 libpulsecore-0.9.21.so52.0408 libpulse.so.0.12.241.6327 libpulsecommon-0.9.21.so31.2245 libmozjs.so20.8163 bash20.8163 compiz20.8163 firefox-binCPU_CLK_UNHALT...|samples|%|------------------150.0000 firefox-bin150.0000 [vdso] (tgid:20061range:0x7fff713ff000-0x7fff71400000)20.8163 libnspr4.so20.8163 VBoxRT.so10.4082 ld-2.11.1.so10.4082 libdrm_intel.so.1.0.010.4082 librt-2.11.1.so10.4082 libpthread-2.11.1.so10.4082 Xorg10.4082 libfade.so10.4082 i965_dri.so10.4082 libgstxvimagesink.so10.4082 libQtGui.so.4.6.210.4082 libXdamage.so.1.1.010.4082 libasound.so.2.0.010.4082 libntop-3.3.so10.4082 libxcb.so.1.1.010.4082 libalsa-util.so10.4082 VBoxDD.so10.4082 VirtualBox.so10.4082 libX11.so.6.3.010.4082 sshd注:输出显示了一系列对象文件,文件包含了当profile测试时正在运行的代码.oprofiled 从调用opcontrol --start时开始记录,到调用opcontrol--dump时会截取当前的统计量,但是oprofiled仍会继续搜集并积累统计数据,之后再调用opconrol--dump就会有旧的积累数据产生.直到调用opcontrol --stop时,才会停止搜集.

二)用oprofile统计一个应用程序
统计一个应用程序的过程并不复杂,但要适时地消除和统计数据,一般的步骤是:1)打开后台程序/开始收集数据opcontrol --start --no-vmlinux
2)重置统计量opcontrol --reset
3)运行应用程序./program
4)截取统计数据或停止后台程序opcontrol --dumpopcontrol --shutdown
我们用下面的程序进行测试:
#include#include#include#include
double slow(double x){returnpow(x,1.12345);}
double slower(double x){return1.0/x;}
double slowest(double x){returnsqrt(x);}

int main (int argc, char *argv[]){inti;doublex;
for(i = 0;i < 3000000; i++){x= 100.0;x= slow(x);x= slower(x);x= slowest(x);}}编译:gcc -o profme -O2 -lm profme.c

启动oprofile,如下:opcontrol --start --no-vmlinux
查看当前的oprofiled状态:opcontrol --statusDaemon running: pid 2747Separate options: nonevmlinux file: noneImage filter: noneCall-graph depth: 0
清理统计数据,如下:opcontrol --reset
运行测试程序,如下:./profme
截取统计数据,如下:opcontrol --dump
输出统计量,如下:opreportCPU: CPU with timer interrupt, speed 0 MHz (estimated)Profiling through timer interruptTIMER:0|samples|%|------------------453282.7763 no-vmlinux69712.7306 libm-2.5.so2163.9452 profme180.3288 libc-2.5.so50.0913 ld-2.5.so30.0548 bash10.0183 gawk10.0183 libdbus-1.so.3.2.010.0183 oprofiled10.0183 sshd
注:输出的结果显示程序在标准的数学库libm中花费了它大部分时间.我们可以通过gprof来产生一个gmon.out文件,如下:opgprof ./profme
【转】Linux调优工具oprofile的演示分析 linux性能分析与调优
不调用图像数据得出gmon.out结果gprof --no-graph ./profmeFlat profile:
Each sample counts as 1 samples.%cumulativeselfselftotaltimesamplessamplescallsT1/call T1/callname41.6790.0090.00slowest25.00144.0054.00slower16.67180.0036.00slow15.74214.0034.00main0.93216.002.00_init

三)opannotate工具
opannotate可以对程序的每一行所用的时间进行统计,生成详细的时间,而不只是样品统计量和执行次数.
我们用下面这个程序进行测试,如下:#include#include#include#include#include
volatile double x;
intmain (int argc, char *argv[]){inti;for(i = 0;i < 16000000; i++){x= 1000.0;
intr = i & 0xf;
if(r <= 8){x= pow(x,1.234);}elseif(r<= 11){x= sqrt(x);}else{x= 1.0/x;}}}
编译:gcc -g -O2 -o summer-proj summer-proj.c-lm
首先清理之前的数据,如下:opcontrol --reset
重新启用oprofiled,如下:opcontrol --start
执行summer-proj程序:./summer-proj
截取统计数据:opcontrol --dump
通过opannotate来查看程序中每行程序所要用到的时间,如下:opannotate --source ./summer-proj

:#include:#include:#include:#include:#include::volatiledouble x;::int:main(int argc, char *argv[]):{:inti;12842.8094 :for(i = 0;i < 16000000; i++){72.3411 :x= 1000.0;:113.6789 :intr = i & 0xf;::if(r <= 8){248.0268 :x= pow(x,1.234);:}:else82.6756 :if(r<= 11){8929.7659 :x= sqrt(x);:}:else:{258.3612 :x= 1.0/x;:}:}:}四)关于oprofile的最终论述
这里只提到了oprofile的表面功能.默认情况下,oprofile不支持在虚拟机上进行调试,我们可以通过下面的方法让oprofile可以在虚拟机上跑,如下:

echo "options oprofile timer=1" >>/etc/modprobe.conf此时再重启虚拟机就可以工作了.

  

爱华网本文地址 » http://www.aihuau.com/a/25101014/194887.html

更多阅读

声明:《转 Linux调优工具oprofile的演示分析 linux性能分析与调优》为网友爷独霸后宫分享!如侵犯到您的合法权益请联系我们删除