分类:
2009-10-25 19:30:36
oprofile:
常用:1. opcontrol --reset; opcontrol --start --no-vmlinux --event=?
2. ./应用程序
3. opcontrol --stop; opreport -l ./应用程序; opcontrol --shutdown
1. opcontrol --init
2. opcontrol --vmlinux=/boot/vmlinux
3. opcontrol --setup --event=CYCLES:1000::0:1
--event=name:count:unitmask:kernel:user
event:在/usr/share/oprofile/中
4. opcontrol --start && ./cache
5. opcontrol --dump
6. opcontrol --stop
7. opcontrol --shutdown
8. opreport -l /boot/vmlinux
9. opreport -l ./ffmpeg
opcontrol --reset可以不用在opcontrol环境下运行。
运行opcontrol,先opcontrol --reset
opcontrol 配置要收集的数据
op_help 显示系统处理器的可用事件以及每个事件的简单描述
opreport 获得有用的profile数据
Opannotate 如果应用程序使用调试符号编译了,创建带注解
oprofiled 作为守护进程来运行,定期把样品数据写入磁盘
Oparchive 收集可执行文件信息和调试信息,将采样文件归档
op_import 把样品数据库文件从异类二进制格式转换成系统的本地原始格式。只有在分析不同体系的样品数据库时才使用该选项。
OPROFILE指南
1.概述:
Oprofile是一个linux2.2/4/6版本,多种体系结构(X86家族的,如AMD64,只需要简单的导出一个变量就可以了)的性能检测工具,它可以对一个运行程序进行各方面的检测,从内核到库再到二进制文件,都可以以较低的开销在后台进行检测,并且它的优点是不用修改源程序。
如果想对包括内核在内的都进行profile,则需要使用命令opcontrol –vmlinux=/boot/vmlinux-‘uname –r’,否则使用opcontrol –no-vmlinux。开始profile使用opcontrol –start,结束使用opcontrol –shutdown。
Profile的结果会周期性的写入/var/lib/oprofile/samples目录下,opcontrol –shutdown或opcontrol –dump也会将结果写入那个目录中。如果想清空以前的记录,使用opcontrol –reset命令。
为了得到整个系统的总体结果,运行命令 opreport。如果想得到细节的信息,运行命令opreport –l /boot/vmlinux-‘uname –r’
2.Opcontrol命令:
Op_help: 列出所有支持的事件。
Opcontrol: 设置需要收集的事件。
Opreport: 对结果进行统计输出。
Opannaotate: 产生带注释的源/汇编文件,源语言级的注释需要编译源文件时的支持。
Opstack: 产生调用图profile,但要求x86/2.6的平台,并且linux2.6安装了call-graph patch
Opgprof: 产生如gprof相似的结果。
Oparchive: 将所有的原始数据文件收集打包,可以到另一台机器上进行分析。
Op_import: 将采样的数据库文件从另一种abi转化成本地格式。
3.Opcontrol命令的选项:
--list-event:列出本处理器上所有支持的事件。
--init: 加载oprofile模块,并初始化oprofile接口。
--setup: 后边跟着要设置的事件名称,支持的事件名称在/root/.oprofile/daemonrc.中。(基本没什么用,可以通过传递一个参数来实现opcontrol –no-vmlinux)。
--start-daemon: 启动daemon程序,这样可以使start时记录信息中除去启动daemon的那部分。(2.2/4内核不支持)
--start: 开始数据的收集工作,收集的数据由setup指定,或者由/root/.oprofile/daemon中列出的事件指定。
--dump: 强迫将数据flush到daemon。
--stop: 停止数据收集。
--shutdown: 停止数据收集,结束daemon程序。
--reset: 清除当前会话中收集到的数据,但以前saved过的数据不清除。
--save=session_name: 将当前会话的数据存入session_name名的会话中。
--deinit: 关闭当前daemon,将oprofile模块移除。
--list-events: 列出所有支持的事件和mask值。
--help: 帮助信息。
下边是一些可选的信息项,必须是—no-vmlinux或—vmlinux选项的支持,这些信息存储在~/.oprofile/daemonrc中。
--buffer-size=num: 内核buffer的sample的数目。
--cpu-buffer-size=num: 每个cpu的buffer的sample的数目。
--event=eventspec: 指定要收集的硬件参数。
--separate=[none,lib,kernel,thread,cpu,all] : 指定是否将这些信息分别收集。
--callgraph=#depth : 指定收集depth深度的调用信息。
--image=image: 指定要对哪些image进行收集。
--vmlinux=file: 内核image
--no-vmlinux: 不收集内核信息。
Opcontrol --event-list可以列出所有支持的事件,形式如下:
name:count:unitmask:kernel:user
当处理器的性能检测寄存器溢出时,就会产生中断,这个是oprofile的运行的基础。然而由于所有处理器中的中断时间的发生和处理中断程序之间存在间隔,所以这些profile得到的结果并不是完全精确。每个处理器指针可以配置的参数包括:
mask:指明要记录的时间。
Val:指令计数开始的下限。(是从这时候开始吧)
Kernel:记录内核态还是记录用户态的情况。
参数的配置情况要求较高,如果配置的较高,则产生的中断数目较少,因此精度低。但如果配置的粒度较小,虽然精度高,但开销也变大。
RTC模式:
由于一些处理器没有那些调试寄存器,所以它们唯一的时钟中断可以被捕获,因此这个支持所有的处理器。但由于在内核态时中断被关闭,所以RTC模式不能在内核态使用。由于时钟中断一般为2的幂次/s,所以一般设为2的幂数。如果设的不是,oprofile会自动将它设置为最接近的2的幂次。在2.6或更高的版本上,由于处理器没有调试寄存器,所以oprofile不能使用时钟中断,可以通过time=1模块或将启动命令行中的oprofile.time=1。
在pentium4或exon处理器中有45个事件选择寄存器(ESCR),18个事件配置寄存器(CCCR),18个计数器,由于他们之间的错综复杂的关系,同时只能有上述寄存器中的8个可以互不相关的使用。由于没有进一步的精确事件(PEBS)为基础的支持,因此目前只能使用中断为基础的事件收集方法。但超线程技术目前还不支持。
Itanium2处理器中的pmu(performance monitor unit)所有的特性目前oprofile还不支持。如果将调试寄存器的值设置的过低,则可能会引起频繁的中断,使处理器忙于处理中断而无暇估计别的事件,此时整个处理器就会发生冻结的情况。在2.6以上的版本中,可以设置pid,pgrp参数来过滤所搜集的数据,具体使用方式为opcontrol –pid-filter=??或opcontrol –pgrp-filter。
在oprofile停止之后的一小段事件内先不要unload模块,可能会引起危险。2.6内核或smp模块不支持unload模块。
统计结果输出:
为了减小开销,统计的结果分为初始统计数据和最终输出结果两部分。进一步,初始统计数据不一定都在硬盘上存在,因此你必须显式的将数据刷入磁盘,具体使用opcontrol –dump命令。
Opannotate命令用来输出带注释的源文件或汇编。如果在编译二进制文件时加入了-g选项,则可以生成带注释的源文件,否则只能生成带注释的汇编了。--source或—assembly用来指明是否是汇编文件。用—base-dir来指明文件的原本位置,用—search-dir来指明用来搜索的文件目录。
Opstack输出调用图,它的显示意义还是看不懂。它仅在x86/linux结构下支持,其余的模式需要添加安装包。
Gprof模式的输出,使用opgprof可以产生一个gmon.out文件,然后调用gprof –p来生成gprof类似的输出。
Oparchive可以将目前的可执行文件,调试信息,prof文件等打包然后可以在另一台机器上进行分析。
对指定的任务进行profile,可以通过如下模式:opreport name:value[,value]。Name一般为image,value指出你要进行profile的文件名。
Profile可以指定的参数包括:
Session:指明session
Session-exclude:指明排除的session
Image:指明image
Image-exclude
Lib-image:
Lib-image-exclude:
Event:事件列表
Count:计数器列表,指出当时profile时指明的事件count值。
Cpu:指定要profile的cpu。
Tgid:task gid,当per-process参数被指明时有用。
Tid:thread gid,当per-process参数被指明时有用。
Uint-mask:指明mask列表。
--image-path:指明image的path。
--merge:将以前separate的结果重新merge,以便得到统一的结果。
Oprofile的限制:由于现代处理器的乱序执行,有些指令的执行事件不精确,尤其是循环中的最后一条指令,并且它的开销比较大的话几乎是不可靠的。Oprofile使用在中断处理函数中收集数据的方法,但在RTC时钟中断时中断被屏蔽,或itanium2中的可屏蔽中断中这些中断都不能得到及时的处理,因此这些也会对结果造成影响。对于有些idle时自动关闭的CPU来说,idle时的时钟就不能被正确的记录,因此需要在启动时加上idle=poll选项,使CPU在idle时调用poll_idle函数。
在2.6的实现中使用do_exit()内核函数退出的子程序不能被profile。 在profile kernel的过程中,由于启动时使用了initrd功能,所以oprofile不能正确定位内核模块的位置,因此需要你在使用oprofile时加上-p选项,告诉内核模块的位置。或者你通过insmod,modprob等方式增加了新模块之后,一定要通过-p选项来指明新模块的位置,以免profile去测试那些内核中的旧模块。调用图的解释中,首先要确保编译时没有使用 -fomit-frame-pointer 选项.
推荐一篇好文章: William E. Cohen, "Tuning Programs with OProfi le"