使用oprofile查找性能瓶颈--错误及解决

1>确定以下内核选项已选定:

CONFIG_OPROFILE

CONFIG_X86_LOCAL_APIC

CONFIG_X86_IO_APIC

CONFIG_PCI_IOAPIC


2> oprofile 命令

opcontrol --init   #加载模块 

opcontrol --vmlinux=/path/vmlinux  #是否对kernel进行profiling 
opcontrol --reset  #清除当前会话中的数据 
opcontrol --start  #开始profiling 

./progam   #运行应用程序,oprofile会对它进行profiling 

opcontrol --dump  #把收集到的数据写入文件 
opcontrol --stop  #停止profiling 
opcontrol --shutdown  #关闭守护进程oprofiled 
opcontrol --deinit  #卸载模块 

opcontrol -l # 列出当前可用监控事件.


opreport -l # 列出当前内核性能统计信息.
opannotate -s ./program # 列出引用程序性能统计信息


3. 问题处理

1> # ./opcontrol --init
  grep: /etc/mtab: No such file or directory
  grep: /etc/mtab: No such file or directory
Kernel support not available, missing opcontrol --init as root ? 错误怎么解决?
# mount -o remount rw /
# mount -o rw,remount -t yaffs2 /dev/mtdblock3 /system
# touch /etc/mtab
# echo nodev /dev/oprofile oprofilefs rw 0 0>/etc/mtab
 
2> #./opcontrol --init
Kernel support not available, missing opcontrol --init as root ? 错误怎么解决?
检查/etc/mtab文件内容,确保是nodev /dev/oprofile oprofilefs rw 0 0
 
3> # opcontrol --init           
opcontrol --init
cat: can't open '/dev/oprofile/cpu_type': No such file or directory
Unable to open cpu_type file for reading
Make sure you have done opcontrol --init
cpu_type 'unset' is not valid
you should upgrade oprofile or force the use of timer mode  错误怎么解决?
执行
# mount -t oprofilefs nodev /dev/oprofile
4> # opcontrol --start
mkdir: can't create directory '/var/': Read-only file system
Couldn't mkdir -p /var/lib/oprofile   错误怎么解决?
执行
# mount -o remount rw /
展开阅读全文

使用oprofile分析性能瓶颈

08-07

使用oprofile分析性能瓶颈rnrnrn1. 概述rnrnoprofile 是 Linux 平台上,类似 INTEL VTune 的一个功能强大的性能分析工具。rnrn其支持两种采样(sampling)方式:基于事件的采样(event based)和基于时间的采样(time based)。rnrn基于事件的采样是oprofile只记录特定事件(比如L2 cache miss)的发生次数,当达到用户设定的rn定值时oprofile 就记录一下(采一个样)。这种方式需要CPU 内部有性能计数器(performace counter)。rn现代CPU内部一般都有性能计数器,龙芯2E内部亦内置了2个性能计数器。rnrn基于时间的采样是oprofile 借助OS 时钟中断的机制,每个时钟中断 oprofile 都会记录一次(采一次样)。rn引入的目的在于,提供对没有性能计数器 CPU 的支持。其精度相对于基于事件的采样要低。因为要借助 OSrn时钟中断的支持,对禁用中断的代码oprofile不能对其进行分析。rnrnoprofile 在Linux 上分两部分,一个是内核模块(oprofile.ko),一个为用户空间的守护进程(oprofiled)。rn前者负责访问性能计数器或者注册基于时间采样的函数(使用register_timer_hook注册之,使时钟中断处理rn程序最后执行profile_tick 时可以访问之),并采样置于内核的缓冲区内。后者在后台运行,负责从内核空rn间收集数据,写入文件。rnrnrn2. oprofile 的安装rnrn以龙芯2E平台为例,要使用oprofile 首先得采用打开oprofile支持的内核启动。然后安装下面3个软件包:rnoprofile, oprofile-common, oprofile-gui,其中核心软件包是oprofile-common,其包括以下工具集:rnrn /usr/bin/oprofiled 守护进程rn /usr/bin/opcontrol 控制前端,负责控制与用户交互,用得最多 rn /usr/bin/opannotate 根据搜集到的数据,在源码或者汇编层面上注释并呈现给用户rn /usr/bin/opreport 生成二进制镜像或符号的概览rn /usr/bin/ophelp 列出oprofile支持的事件rn /usr/bin/opgprof 生成gprof格式的剖析数据rn ...rnrnrn目前oprofile 在龙芯2E上已经移植好了,包括用户空间的工具集软件包,亦可用矣。rnrn一个测试用的内核,已经打开 oprofile ,位于 http://people.openrays.org/~comcat/godson/vmlinux-2.6.18-oprofilernrn用户空间工具集deb 包位于: http://people.openrays.org/~comcat/godson/oprofile-0.9.2/rnrnrn3. oprofile 快速上手rnrna. 初始化rnrn opcontrol --initrnrn 该命令会加载oprofile.ko模块,mount oprofilefs。成功后会在/dev/oprofile/目录下导出rn 一些文件和目录如: cpu_type, dump, enable, pointer_size, stats/rnrnb. 配置rnrn 主要设置计数事件和样本计数,以及计数的CPU模式(用户态、核心态)rn rn opcontrol --setup --event=CYCLES:1000::0:1rnrn 则是设置计数事件为CYCLES,即对处理器时钟周期进行计数rn 样本计数为1000,即每1000个时钟周期,oprofile 取样一次。rn 处理器运行于核心态则不计数rn 运行于用户态则计数rnrn --event=name:count:unitmask:kernel:userrnrn name: event name, e.g. CYCLES or ICACHE_MISSES rn count: reset counter value e.g. 100000rn unitmask: hardware unit mask e.g. 0x0frn kernel: whether to profile kernel: 0 or 1rn user: whether to profile userspace: 0 or 1rnrnc. 启动rnrn opcontrol --startrnrnrnd. 运行待分析之程序rnrn ./ffmpeg -c cif -vcodec mpeg4 -i /root/paris.yuv paris.avirnrne. 取出数据rnrn opcontrol --dumprn opcontrol --stoprnrnf. 分析结果rnrn opreport -l ./ffmpegrnrnrn则会输出如下结果:rnrnCPU: GODSON2E, speed 0 MHz (estimated)rnCounted CYCLES events (Cycles) with a unit mask of 0x00 (No unit mask) count 10000rnsamples % symbol namern11739 27.0148 pix_abs16_crn6052 13.9274 pix_abs16_xy2_crn4439 10.2154 ff_jpeg_fdct_islowrn2574 5.9235 pix_abs16_y2_crn2555 5.8798 dct_quantize_crn2514 5.7854 pix_abs8_crn2358 5.4264 pix_abs16_x2_crn1388 3.1942 diff_pixels_crn964 2.2184 ff_estimate_p_frame_motionrn852 1.9607 simple_idct_addrn768 1.7674 sse16_crn751 1.7283 ff_epzs_motion_searchrn735 1.6914 pix_norm1_crn619 1.4245 pix_sum_crn561 1.2910 mpeg4_encode_blocksrn558 1.2841 encode_threadrn269 0.6190 put_no_rnd_pixels16_crn255 0.5868 dct_unquantize_h263_inter_crnrn......rnrnrn4. 例子rnrnoprofile 可以分析处理器周期、TLB 失误、分支预测失误、缓存失误、中断处理程序,等等。rn你可以使用 opcontrol --list-events 列出当前处理器上可监视事件列表。rnrn下面分析一个编写不当的例子:rnrnrn[带有cache问题的代码cache.c]rn+++++++++++++++++++++++++++++++++++++++++++++++rnrnint matrix[2047][7];rnrnrnvoid bad_access()rnrn int k, j, sum = 0;rnrn for(k = 0; k < 7; k++)rn for(j = 0; j < 2047; j++)rn sum += matrix[j][k] * 1024;rnrnrnrnint main()rnrn int i;rnrn for(i = 0; i< 100000; i++)rn bad_access();rnrn return 0;rnrnrnrn+++++++++++++++++++++++++++++++++++++++++++++++rnrnrn编译之: gcc -g cache.c -o cachernrnrn使用oprofile 分析之:rnrnopcontrol --initrnrnopcontrol --setup --event=DCACHE_MISSES:500::0:1rnrnopcontrol --start && ./cache && opcontrol --dump && opcontrol --stoprnrnrn使用 opannotate 分析结果为:rnrn/*rn* Command line: opannotate --source ./cacheern*rn* Interpretation of command line:rn* Output annotated source file with samplesrn* Output all filesrn*rn* CPU: GODSON2E, speed 0 MHz (estimated)rn* Counted ICACHE_MISSES events (Instruction Cache misses number ) with a unit mask of 0x00 (No unit mask) count 500rn*/rn/*rn* Total samples for file : "/comcat/test/pmc.test/cachee.c"rn*rn* 34 100.000rn*/rnrnrn :int matrix[2047][7];rn :rn :void bad_access()rn : /* bad_access total: 33 97.0588 */rn : int k, j, sum = 0;rn :rn : for(k = 0; k < 7; k++)rn 33 97.0588 : for(j = 0; j < 2047; j++)rn : sum += matrix[j][k] * 1024;rn :rn :rn :rn :int main()rn : /* main total: 1 2.9412 */rn : int i;rn :rn 1 2.9412 : for(i = 0; i< 10000; i++)rn : bad_access();rn :rn : return 0;rn :rn :rn :rnrnrnopreport 解析的结果为:rnrnGodSonSmall:/comcat/test/pmc.test# opreport -l ./cachernCPU: GODSON2E, speed 0 MHz (estimated)rnCounted ICACHE_MISSES events (Instruction Cache misses number ) with a unit mask of 0x00 (No unit mask) count 500rnsamples % symbol namern33 97.0588 bad_accessrn1 2.9412 mainrnrn可以看到bad_access() cache miss 事件的样本共有33个,占总数的97%rnrnrn改进 bad_access() 为 good_access() 后:rnrnvoid good_access()rnrn int k, j, sum = 0;rnrn for(k = 0; k < 2047; k++)rn for(j = 0; j < 7; j++)rn sum += matrix[k][j] * 1024;rnrnrnrnrnCPU: GODSON2E, speed 0 MHz (estimated)rnCounted ICACHE_MISSES events (Instruction Cache misses number ) with a unit mask of 0x00 (No unit mask) count 500rnsamples % symbol namern22 95.6522 good_accessrn1 4.3478 mainrnrn可以看到改进后 cache miss 事件的样本减少为22个,占总数的95%rnhttp://www.lemote.com/bbs/viewthread.php?tid=7973 论坛

没有更多推荐了,返回首页