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

oprofile移植(如果只是使用请跳过此节)

  • 从oprofile官网 下载最新版源码,并解压。
  • 修改libop/Op_cpu_type.c,在cpu_descrs结构中增加代码:
{ "ICT LOONGSON3", "mips/loongson3", CPU_MIPS_LOONGSON3, 3}, 
  • 修改libop/Op_cpu_type.h,在枚举类型op_cpu中增加代码:
CPU_MIPS_LOONGSON3, /*< ICT LOONGSON3 >*/ 
  • 修改libop/Op_events.c,在函数op_default_event中,switch(cpu_type)增加龙芯3的case:
case CPU_MIPS_LOONGSON3:
descr->name = "CPU_CLK_UNHALTED";
break;
  • 修改libutil/Op_cpufreq.c,在函数op_cpu_frequency中,while(1)循环里增加龙芯3的处理代码:
/* MIPS LOONGSON3 */ 
if (sscanf(line, "BogoMIPS : %lf", &fval) == 1){ 
fval = fval * 3 / 2;
break;
}
  • 修改utils/Ophelper.c,在函数main中,switch (cpu_type) 增加龙芯3的case:
case CPU_MIPS_LOONGSON3:
break;
  • 修改events/Makefile.am,为变量event_files增加龙芯3成员:
mips/loongson3/events mips/loongson3/unit_masks \
  • 修改events/Makefile.in,为变量event_files增加龙芯3成员:
mips/loongson3/events mips/loongson3/unit_masks \
  • 在events/mips目录下,新建龙芯3的子目录:loongson3
  • 在新建的events/mips/loongson3/目录下,新建文件events,编辑其内容为龙芯3支持的所有事件:
# 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
  • 在新建的events/mips/loongson3/目录下,新建文件unit_masks,编辑其内容为龙芯3的unit_mask:
# LOONGSON3 possible unit masks
# name:zero type:mandatory default:0x0
	0x0 No unit mask
  • 设定debian源:
sudo gedit /etc/apt/sources.list
  • 编辑sources.list内容为:
deb http://ftp.debian.org/debian/ lenny main contrib non-free
  • 安装gcc4-.4:
apt-get install gcc-4.4
  • 安装依赖包binutils:
apt-get install binutils-dev
  • 编译oprofile:

首先修改configure文件的可执行属性:

chmod +x configure

配置:

./configure --with-kernel-support --disable-werror

编译:

make

安装:

make install
  • 卸载命令:
make uninstall
  • 编译中如果报错提示为libiberty.h中的申明和string.h中的冲突,则据出错信息,将libiberty.h中报错的那个申明注释掉,再执行编译。

龙芯oprofile用户工具下载

  基于开源的oprofile工具,移植到龙芯平台,主要在代码中添加龙芯的计数器事件。
  源码的下载位置:http://ftp.loongnix.org/toolchain/oprofile/oprofile3asrc.tar.gz
  编译命令为:

 ./configure –with-kernel-support –disable-werror
 make
 make install

目前版本要求编译环境:gcc-4.3

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设置计数器事件
#opcontrol --setup --separate=library --event=TLB_REFILL:300:0
#opcontrol --setup --separate=library --event=FALU1_ISSUED:300:0
#opcontrol --setup --separate=library --event=FALU2_ISSUED:500:0
#opcontrol --setup --separate=library --event=FTQ_FULL:500:0
#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文件

参考文献


返回  首页 | 项目

本页面最后修改于2016年7月26日 (星期二) 02:46。

© 2018 by 龙芯开源社区 • Powered by MediaWiki
京ICP备14017781号