分类: LINUX
2013-03-15 20:32:33
1、Oprofile简介
oprofile 是Linux系统下一个低开销的系统全局的性能监视工具,利用处理器上所包含的专用的性能监视硬件(若没有性能监视硬件则使用一个基于计时器的代用品)来收集与性能相关的数据样品。它获得关于内核以及系统上的可执行文件的信息,例如内存是何时被引用的;L2缓存请求的数量;收到的硬件中断数量等。
Oprofile 在Linux上分两部分,一个是内核模块(oprofile.ko),一个为用户空间的守护进程(oprofiled)。前者负责访问性能计数器或者注册基于时间采样的函数(使用register_timer_hook注册之,使时钟中断处理程序最后执行profile_tick 时可以访问之),并采样置于内核的缓冲区内。后者在后台运行,负责从内核空间收集数据,写入文件。
其支持两种采样(sampling)方式:基于事件的采样(event based)和基于时间的采样(time based)。基于事件的采样是oprofile只记录特定事件(比如L2 cache miss)的发生次数,当达到用户设定的定值时oprofile 就记录一下(采一个样)。这种方式需要CPU内部有性能计数器(performace counter)。基于时间的采样是oprofile借助OS时钟中断的机制,每个时钟中断oprofile都会记录一次(采一次样)。引入的目的在于,提供对没有性能计数器CPU的支持。其精度相对于基于事件的采样要低。
Oprofile的结构可以分为4个部分,kernel driver负责系能计数器数据的采集,每当count计数器最高位为1时发生中断,记录下发生中断时的EPC值,同时还要记录下进程的切换信息;OProfile daemon与内核交互,把内核采集的数据写入采样文件;OProfile control tools设置采样事件,周期等,控制采样的开始与结束;Post-profiling tools根据采样数据进行分析。各部分关系如下图所示:
Oprofile的特点如下:
l 无需重新编译源代码,如果不进行源代码及分析,连调试信息(-g option to gcc)也不是必须的。
l 只在内核中插入一个模块。
l 可以分析运行于系统之上的所有代码(禁用中断的代码除外)
l 系统的额外开销小,Oprofile会增加1%-8%的系统开销(取决于采样频率)
l 兼容所有2.2,2.4,2.6内核,可以运行在SMP系统之上
l 支持主流CPU架构,包括X86、arm、AVR32、mips、powerpc等