Oprofile性能分析工具

OProfile介绍

OProfile是Linux系统的性能分析工具,是一个开源的profiling工具,使用性能计数器来统计信息,能够以非常低的代价剖析程序性能,而且可以对内核进行profiling。它统计的信息非常的多,可以得到cache的缺失率,memory的访存信息,分支预测错误率等。主要支持x86、power处理器,已经移植到龙芯系列处理器,包括龙芯2F、龙芯3A、龙芯3B等。OProfile使用了一个内核模块和一个用户空间守护进程,前者可以访问性能计数寄存器,后者在后台运行,负责从这些寄存器中收集数据。在启动守护进程之前,OProfile 将设置事件类型以及每种事件的样本计数(sample count)。如果没有设置任何事件,那么OProfile 将使用默认事件。事件的样本计数将决定事件每发生多少次计数器才增加一次。OProfile 被设计成可以在低开销下运行,从而使后台运行的守护进程不会扰乱系统性能。Oprofile由kernel驱动和收集采样数据的用户工具组成,支持两种采样方式,基于性能计数器的采样与基于时钟中断的采样,基于性能计数器的采样要求处理器提供支持,龙芯处理器提供了性能计数器,用于支持oprofile。

龙芯3A的性能计数器Performance Counter(具体参考3A手册)

需要根据下面的内容,实现oprofile的kernel驱动。具体patch可以参考龙芯3A的kernel源码中的patch。龙芯3号处理器定义了四个(两组)性能计数器,他们分别映射到CP0寄存器的24号的sel 0,sel 1,sel 2和sel 3。龙芯3号在复位时,为PerfCnt寄存器的两个控制寄存器赋的初始值分别为:
PerfCnt,select 0 =0xc0000000
PerfCnt,select 2 =0x40000000

这四个寄存器的用途如表1所示,每种寄存器的格式如图1所示(两组格式相同),控制寄存器的使能位定义如图2所示:
Image:表1性能计数器列表.png

         表1性能计数器列表

每个计数器都是64位的读/写寄存器,并且在每次关联控制域中可数事件发生时自增。每个计数器都可以独立对一种事件计数。
Image:图1 性能计数器寄存器.png
图1 性能计数器寄存器
当计数器的首位(63位)变成1(计数器溢出)时,计数器将触发一个中断,Cause寄存器PCI位被置一(若有多组计数器,则多组计数器的溢出位或)。在计数器溢出后无论中断是否被告知,计数都将继续。表2描述计数使能位的定义。表3和表4描述计数器0和计数器1各自的事件。Image:表2 计数使能位定义.png
表2 计数使能位定义
Image:表3 计数器0事件.png
表3 计数器0事件
Image:表4 计数器1事件.png
表4 计数器1事件

oprofile移植

1.从oprofile官网(http://oprofile.sourceforge.net/download/)下载最新版源码,并解压
2.修改libop/Op_cpu_type.c,在cpu_descrs结构中增加代码:
{ "ICT LOONGSON3", "mips/loongson3", CPU_MIPS_LOONGSON3, 3},
3.修改libop/Op_cpu_type.h,在枚举类型op_cpu中增加代码:
CPU_MIPS_LOONGSON3, /*< ICT LOONGSON3 >*/
4.修改libop/Op_events.c,在函数op_default_event中,switch(cpu_type)增加龙芯3的case:
case CPU_MIPS_LOONGSON3:
descr->name = "CPU_CLK_UNHALTED";
break;
5.修改libutil/Op_cpufreq.c,在函数op_cpu_frequency中,while(1)循环里增加龙芯3的处理代码:
/* MIPS LOONGSON3 */
if (sscanf(line, "BogoMIPS : %lf", &fval) == 1){
fval = fval * 3 / 2;
break;
}
6.修改utils/Ophelper.c,在函数main中,switch (cpu_type) 增加龙芯3的case:
case CPU_MIPS_LOONGSON3:
break;
7.修改events/Makefile.am,为变量event_files增加龙芯3成员:
mips/loongson3/events mips/loongson3/unit_masks \
8.修改events/Makefile.in,为变量event_files增加龙芯3成员:
mips/loongson3/events mips/loongson3/unit_masks \
9.在events/mips目录下,新建龙芯3的子目录:loongson3
10.在新建的events/mips/loongson3/目录下,新建文件events,编辑其内容为龙芯3支持的所有事件:

  1. LOONGSON3 Events

event:0x00 counters:0 um:zero minimum:10000 name:CPU_CLK_UNHALTED : Cycles outside of haltstate
event:0x01 counters:0 um:zero minimum:5000 name:BRANCH_INSTRUCTIONS : Branch instructions
event:0x02 counters:0 um:zero minimum:400 name:JUMP_INSTRUCTIONS : JR instructions
event:0x03 counters:0 um:zero minimum:500 name:JR31_INSTRUCTIONS : JR(rs=31) instructions
event:0x04 counters:0 um:zero minimum:500 name:ICACHE_MISSES : Instruction cache misses
event:0x05 counters:0 um:zero minimum:500 name:ALU1_ISSUED : ALU1 operation issued
event:0x06 counters:0 um:zero minimum:8000 name:MEM_ISSUED : Memory read/write issued
event:0x07 counters:0 um:zero minimum:300 name:FALU1_ISSUED : Float ALU1 operation issued
event:0x08 counters:0 um:zero minimum:200 name:BHT_BRANCH_INSTRUCTIONS : BHT prediction instructions
event:0x09 counters:0 um:zero minimum:200 name:MEM_READ : Read from primary memory
event:0x0a counters:0 um:zero minimum:300 name:FQUEUE_FULL : Fix queue full
event:0x0b counters:0 um:zero minimum:300 name:ROQ_FULL : Reorder queue full
event:0x0c counters:0 um:zero minimum:300 name:CP0_QUEUE_FULL : CP0 queue full
event:0x0d counters:0 um:zero minimum:300 name:TLB_REFILL : TLB refill exception
event:0x0e counters:0 um:zero minimum:5 name:EXCEPTION : Exceptions
event:0x0f counters:0 um:zero minimum:300 name:INTERNAL_EXCEPTION : Internal exceptions
event:0x10 counters:1 um:zero minimum:5000 name:INSTRUCTION_COMMITTED : Instruction committed
event:0x11 counters:1 um:zero minimum:500 name:BRANCHES_MISPREDICTED : Branch mispredicted
event:0x12 counters:1 um:zero minimum:200 name:JR_MISPREDICTED : JR mispredicted
event:0x13 counters:1 um:zero minimum:200 name:JR31_MISPREDICTED : JR31 mispredicted
event:0x14 counters:1 um:zero minimum:500 name:DCACHE_MISSES : Data cache misses
event:0x15 counters:1 um:zero minimum:500 name:ALU2_ISSUED : ALU2 operation issued
event:0x16 counters:1 um:zero minimum:500 name:FALU2_ISSUED : FALU2 operation issued
event:0x17 counters:1 um:zero minimum:500 name:UNCACHED_ACCESS : Uncached accesses
event:0x18 counters:1 um:zero minimum:500 name:BHT_MISPREDICTED : Branch history table mispredicted
event:0x19 counters:1 um:zero minimum:5000 name:MEM_WRITE : Write to memory
event:0x1a counters:1 um:zero minimum:500 name:FTQ_FULL : Float queue full
event:0x1b counters:1 um:zero minimum:500 name:BRANCH_QUEUE_FULL : Branch queue full
event:0x1c counters:1 um:zero minimum:500 name:ITLB_MISSES : Instruction TLB misses
event:0x1d counters:1 um:zero minimum:500 name:TOTAL_EXCEPTIONS : Total exceptions
event:0x1e counters:1 um:zero minimum:500 name:LOAD_SPECULATION_MISSES : Load speculation misses
event:0x1f counters:1 um:zero minimum:500 name:CP0Q_FORWARD_VALID : CP0 queue forward valid
event:0x20 counters:2 um:zero minimum:100 name:UNALIGNED_ACCESS : Unaligned access
11.在新建的events/mips/loongson3/目录下,新建文件unit_masks,编辑其内容为龙芯3的unit_mask:

  1. LOONGSON3 possible unit masks
  2. name:zero type:mandatory default:0x0

0x0 No unit mask
12.设定debian源:
sudo gedit /etc/apt/sources.list
编辑sources.list内容为:deb http://ftp.debian.org/debian/ lenny main contrib non-free
13.安装gcc4-.4:apt-get install gcc-4.4
14.安装依赖包binutils:apt-get install binutils-dev
15.编译oprofile:
首先修改configure文件的可执行属性:chmod +x configure
配置:./configure --with-kernel-support --disable-werror
编译:make
安装:make install
16.卸载命令:make uninstall
17.编译中如果报错提示为libiberty.h中的申明和string.h中的冲突,则据出错信息,将libiberty.h中报错的那个申明注释掉,再执行编译。

龙芯oprofile用户工具下载

基于开源的oprofile工具,移植到龙芯平台,主要在代码中添加龙芯的计数器事件。
源码的下载位置:git-clone username@10.2.5.22:/git/ oprofile.git
编译命令为:./configure –with-kernel-support –disable-werror

           make

           make install

目前版本要求编译环境:gcc-4.3
该工具编译好的debian包下载地址为:lftp 10.2.5.23
cd pub/oprofile

oprofile常用命令

opcontrol –list-events列举支持的计数器事件
opcontrol –init 初始化oprofile,使oprofile接口可用
opcontrol –setup 设置剖析项
opcontrol –start 启动oprofile
可以使用man opcontrol查看命令参数的具体含义

oprofile使用示例

使用opcontrol命令时,需要root用户权限,也可是使用sudo。
opcontrol --reset
opcontrol --init
opcontrol --no-vmlinux
opcontrol --setup --separate=library --event=CPU_CLK_UNHALTED:10000:0设置计数器事件

  1. opcontrol --setup --separate=library --event=TLB_REFILL:300:0
  2. opcontrol --setup --separate=library --event=FALU1_ISSUED:300:0
  3. opcontrol --setup --separate=library --event=FALU2_ISSUED:500:0
  4. opcontrol --setup --separate=library --event=FTQ_FULL:500:0
  5. opcontrol --setup --separate=library --event=UNCACHED_ACCESS:500:0

opcontrol --start
ls;ls;ls;ls;ls;ls;ls 运行要剖析的程序,此处是运行ls命令
opcontrol --shutdown
opreport -l /bin/ls >ls.log 把采样数据定向到log文件

参考文献

1.http://oprofile.sourceforge.net/news
oprofile官方网站
2.http://www.ibm.com/developerworks/cn/linux/l-pow-oprofile/index.html
http://www.ibm.com/developerworks/cn/linux/l-oprof/index.html
IBM开发人员写的非常有用的参考文献


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值