使用oprofile分析性能瓶颈
1. 概述
oprofile 是 Linux 平台上,类似 INTEL VTune 的一个功能强大的性能分析工具。
其支持两种采样(sampling)方式:基于事件的采样(event based)和基于时间的采样(time based)。
基于事件的采样是oprofile只记录特定事件(比如L2 cache miss)的发生次数,当达到用户设定的
定值时oprofile 就记录一下(采一个样)。这种方式需要CPU 内部有性能计数器(performace counter)。
现代CPU内部一般都有性能计数器,龙芯2E内部亦内置了2个性能计数器。
基于时间的采样是oprofile 借助OS 时钟中断的机制,每个时钟中断 oprofile 都会记录一次(采一次样)。
引入的目的在于,提供对没有性能计数器 CPU 的支持。其精度相对于基于事件的采样要低。因为要借助 OS
时钟中断的支持,对禁用中断的代码oprofile不能对其进行分析。
oprofile 在Linux 上分两部分,一个是内核模块(oprofile.ko),一个为用户空间的守护进程(oprofiled)。
前者负责访问性能计数器或者注册基于时间采样的函数(使用register_timer_hook注册之,使时钟中断处理
程序最后执行profile_tick 时可以访问之),并采样置于内核的缓冲区内。后者在后台运行,负责从内核空
间收集数据,写入文件。
2. oprofile 的安装
以龙芯2E平台为例,要使用oprofile 首先得采用打开oprofile支持的内核启动。然后安装下面3个软件包:
oprofile, oprofile-common, oprofile-gui,其中核心软件包是oprofile-common,其包括以下工具集:
/usr/bin/oprofiled 守护进程
/usr/bin/opcontrol 控制前端,负责控制与用户交互,用得最多
/usr/bin/opannotate 根据搜集到的数据,在源码或者汇编层面上注释并呈现给用户
/usr/bin/opreport 生成二进制镜像或符号的概览
/usr/bin/ophelp 列出oprofile支持的事件
/usr/bin/opgprof 生成gprof格式的剖析数据
...
目前oprofile 在龙芯2E上已经移植好了,包括用户空间的工具集软件包,亦可用矣。
一个测试用的内核,已经打开 oprofile ,位于
http://people.openrays.org/~comcat/godson/vmlinux-2.6.18-oprofile
用户空间工具集deb 包位于:
http://people.openrays.org/~comcat/godson/oprofile-0.9.2/
3. oprofile 快速上手
a. 初始化
opcontrol --init
该命令会加载oprofile.ko模块,mount oprofilefs。成功后会在/dev/oprofile/目录下导出
一些文件和目录如: cpu_type, dump, enable, pointer_size, stats/
b. 配置
主要设置计数事件和样本计数,以及计数的CPU模式(用户态、核心态)
opcontrol --setup --event=CYCLES:1000::0:1
则是设置计数事件为CYCLES,即对处理器时钟周期进行计数
样本计数为1000,即每1000个时钟周期,oprofile 取样一次。
处理器运行于核心态则不计数
运行于用户态则计数
--event=name:count:unitmask:kernel:user
name: event name, e.g. CYCLES or ICACHE_MISSES
count: reset counter value e.g. 100000
unitmask: hardware unit mask e.g. 0x0f
kernel: whether to profile kernel: 0 or 1
user: whether to profile userspace: 0 or 1
c. 启动
opcontrol --start
d. 运行待分析之程序
./ffmpeg -c cif -vcodec mpeg4 -i /root/paris.yuv paris.avi
e. 取出数据
opcontrol --dump
opcontrol --stop
f. 分析结果
opreport -l ./ffmpeg
则会输出如下结果:
CPU: GODSON2E, speed 0 MHz (estimated)
Counted CYCLES events (Cycles) with a unit mask of 0x00 (No unit mask) count 10000
samples% symbol name
11739 27.0148pix_abs16_c
6052 13.9274pix_abs16_xy2_c
4439 10.2154ff_jpeg_fdct_islow
2574 5.9235pix_abs16_y2_c
2555 5.8798dct_quantize_c
2514 5.7854pix_abs8_c
2358 5.4264pix_abs16_x2_c
1388 3.1942diff_pixels_c
964 2.2184ff_estimate_p_frame_motion
852 1.9607simple_idct_add
768 1.7674sse16_c
751 1.7283ff_epzs_motion_search
735 1.6914pix_norm1_c
619 1.4245pix_sum_c
561 1.2910mpeg4_encode_blocks
558 1.2841encode_thread
269 0.6190put_no_rnd_pixels16_c
255 0.5868dct_unquantize_h263_inter_c
......
4. 例子
oprofile 可以分析处理器周期、TLB 失误、分支预测失误、缓存失误、中断处理程序,等等。
你可以使用 opcontrol --list-events 列出当前处理器上可监视事件列表。
下面分析一个编写不当的例子:
[带有cache问题的代码cache.c]
+++++++++++++++++++++++++++++++++++++++++++++++
int matrix[2047][7];
void bad_access()
{
int k, j, sum = 0;
for(k = 0; k < 7; k++)
for(j = 0; j < 2047; j++)
sum += matrix[j][k] * 1024;
}
int main()
{
int i;
for(i = 0; i< 100000; i++)
bad_access();
return 0;
}
+++++++++++++++++++++++++++++++++++++++++++++++
编译之: gcc -g cache.c -o cache
使用oprofile 分析之:
opcontrol --init
opcontrol --setup --event=DCACHE_MISSES:500::0:1
opcontrol --start && ./cache && opcontrol --dump && opcontrol --stop
使用 opannotate 分析结果为:
/*
* Command line: opannotate --source ./cachee
*
* Interpretation of command line:
* Output annotated source file with samples
* Output all files
*
* CPU: GODSON2E, speed 0 MHz (estimated)
* Counted ICACHE_MISSES events (Instruction Cache misses number ) with a unit mask of 0x00 (No unit mask) count 500
*/
/*
* Total samples for file : "/comcat/test/pmc.test/cachee.c"
*
* 34 100.000
*/
:int matrix[2047][7];
:
:void bad_access()
:{ /* bad_access total: 33 97.0588 */
: int k, j, sum = 0;
:
: for(k = 0; k < 7; k++)
33 97.0588 : for(j = 0; j < 2047; j++)
: sum += matrix[j][k] * 1024;
:
:}
:
:int main()
:{ /* main total: 12.9412 */
: int i;
:
12.9412 : for(i = 0; i< 10000; i++)
: bad_access();
:
: return 0;
:
:}
:
opreport 解析的结果为:
GodSonSmall:/comcat/test/pmc.test# opreport -l ./cache
CPU: GODSON2E, speed 0 MHz (estimated)
Counted ICACHE_MISSES events (Instruction Cache misses number ) with a unit mask of 0x00 (No unit mask) count 500
samples% symbol name
33 97.0588bad_access
1 2.9412main
可以看到bad_access() cache miss 事件的样本共有33个,占总数的97%
改进 bad_access() 为 good_access() 后:
void good_access()
{
int k, j, sum = 0;
for(k = 0; k < 2047; k++)
for(j = 0; j < 7; j++)
sum += matrix[k][j] * 1024;
}
CPU: GODSON2E, speed 0 MHz (estimated)
Counted ICACHE_MISSES events (Instruction Cache misses number ) with a unit mask of 0x00 (No unit mask) count 500
samples% symbol name
22 95.6522good_access
1 4.3478main
可以看到改进后 cache miss 事件的样本减少为22个,占总数的95%
可以使用gprof, 编译你程序时加 -pg -g
运行之会在当前目录产生 gmon.out
gprof ./your_program_name
就可以看到了
----------------------------------------
使用oprofile 更精确:
opcontrol --reset
opcontrol --init
opcontrol --setup --event=CYCLES:1000
opcontrol --start && ./your_program_name && opcontrol --dump && opcontrol --stop
opreport -l ./your_program_name
就可以看到了,使用oprofile,编译时只要加 -g 就可以了
分享到:
相关推荐
Android Linux 下用 OProfile 工具分析性能 OProfile 是一种用于 Linux 的评测工具,能够帮助用户识别系统中的性能瓶颈。该工具可以工作在不同的体系结构上,包括 IA32, IA64 和 AMD Athlon 系列。OProfile 的优点...
0.9.4版本是该工具的一个稳定发行版,提供了丰富的功能,帮助开发者深入了解程序运行时的行为,找出性能瓶颈,从而进行针对性的优化。 Oprofile的核心功能包括: 1. **CPU事件采样**:Oprofile能够监控CPU的各种...
Oprofile是Linux系统中的一款性能分析工具,它可以帮助开发者深入了解系统的运行状况,定位程序中的性能瓶颈。Oprofile通过硬件事件采样,收集系统层面的运行数据,包括CPU指令执行、内存访问、磁盘I/O等,从而为...
Oprofile是一款强大的Linux性能分析工具,它可以帮助系统管理员和开发者深入了解系统的运行情况,找出程序性能瓶颈,优化代码效率。本手册详细介绍了如何使用Oprofile进行系统性能分析。 一、Oprofile概述 ...
Oprofile 是一个开源的、跨平台的系统性能分析工具,它可以帮助开发者深入了解操作系统和应用程序的性能瓶颈。在Linux系统中,Oprofile 提供了一个低开销的方式,来收集和分析不同层次的软件性能数据,包括内核、...
Oprofile能够帮助开发者和系统管理员深入了解系统的运行情况,找出性能瓶颈,从而优化程序和系统性能。Oprofile-0.9.7是该工具的一个特定版本,包含了对Linux内核的性能监测支持。 **Oprofile的基本功能:** 1. **...
Oprofile是一款强大的Linux性能分析工具,它可以在系统级别对各种硬件事件进行采样,如CPU周期、缓存命中、指令执行等,从而帮助开发者和系统管理员深入理解系统运行时的行为,找出性能瓶颈。在"oprofile-0.9.5.tar....
它的主要作用是收集系统级的性能数据,包括CPU周期、缓存命中率、指令执行情况等,用于定位程序的性能瓶颈。OProfile 0.9.99是该工具的一个版本,它可能包含了一些新的特性或改进,以适应不断发展的硬件和软件需求。...
1. **性能优化**:当开发人员希望提高应用程序或系统的整体性能时,OProfile可以提供详细的性能数据,从而帮助识别哪些部分是性能瓶颈。 2. **故障诊断**:在系统出现性能问题或不稳定时,OProfile可以通过收集的...
通过对处理器事件的跟踪,如TLB故障、停顿时间、内存访问频率、DCU中的总线活动情况、DCU故障周期、非缓存和缓存指令的获取次数等,Oprofile能够提供详尽的数据支持,辅助开发者定位性能瓶颈所在。 #### 二、...
Oprofile 是一款低开销、系统级的采样型性能分析工具,主要用于 Linux 平台上的性能瓶颈定位与优化工作。它可以帮助开发者确定程序运行时哪些部分消耗了过多的处理器时间,以及为何会消耗如此多的时间。通过 ...
在Android这个基于Linux内核的操作系统上,Oprofile同样能够发挥其作用,帮助开发者识别性能瓶颈,优化Dalvik虚拟机和其他系统服务的运行效率。 **一、基本信息** Oprofile工作原理是通过内核模块来周期性地记录...
在Android系统中,`OProfile`可以帮助开发者定位应用程序中的性能瓶颈,如CPU过度使用、内存泄漏等问题。 使用`OProfile`进行性能分析通常包含以下步骤: 1. **安装OProfile**:首先需要在Linux环境下安装`...
**OProfile**是一款功能强大的Linux性能分析工具,主要用于监控程序执行过程中的各种硬件计数器事件,从而帮助开发者识别性能瓶颈并进行优化。该手册提供了OProfile工具的详细介绍与使用指南。 #### 二、OProfile的...
在Linux平台中,系统级性能分析工具oprofile是一个不可或缺的工具,尤其对于开发者来说,它能帮助找出系统中的性能瓶颈。本文将详细阐述如何将oprofile移植到JK2410开发板上。 1. **Oprofile的简介** - Oprofile是...
`oprofile` 的优势在于其全面性,它能够跨进程、跨线程地分析性能,而且对硬件事件(如CPU周期、缓存未命中等)有很好的支持。 - **安装与配置**:首先,需要在Linux系统上安装`oprofile`,通常可以通过包管理器如`...
还有WebXProfiler、TProfiler、BTrace、VisualVM等Java相关的分析工具,以及性能分析平台OProfile、Perf和Google-Perftools等。 5. 时间消耗分析与瓶颈查找 在性能分析过程中,时间消耗分析是至关重要的,它有助于...
在分析性能时,性能调优工具如perf和Oprofile的基本原理是对被监测对象进行采样。利用tick中断可以触发采样点,在采样点中分析程序上下文来了解程序的热点部分。采样的频率和时间长度是影响分析结果可靠性的关键。 ...
5. 分析结果:停止OProfile,生成报告,通过报告理解程序的性能瓶颈。对于Cell处理器,特别要注意SPEs的利用率和通信效率。 压缩包内的"op_model_cell.c"文件很可能包含了针对Cell处理器的OProfile模型代码,可能...