OProfile是一个linux 2.2/2.4/2.6系统(支持多CPU架构)上的分析系统,它可以分析一个正在运行的系统的所有部分,从内核(包括模块和中断处理例程)到共享库(shared libraries),再到二进制文件(可执行文件)。它以低开销悄无声息地运行在后台,收集系统信息。这些特点决定了它是一个非常理想的工具来分析整个系统以查找性能瓶颈在哪里。
很多CPU都提供”性能计数器”(performance counters),一种硬件计数器可以用来对事件(event)计数;比方说,缓存未命中(cache misses)或者CPU周期(CPU cycle)。OProfile基于这些事件来提供代码分析的能力:当一定数量(可配置)的事件发生时,PC(程序计数器)就被记录,如此反复进行。这些信息被汇总成对每个二进制文件的分析结果。
一些硬件配置不允许OProfile使用性能计数器,对于这种情况,不可以使用事件来对PC进行计数,这时OProfile只能以timer/RTC模式运行。
OProfile在很多情形下都非常有用,当你有以下需求时可以考虑使用OProfile:
1. 需要低开销
2. 不能使用高内嵌的分析方法(highly intrusive profiling methods)
3. 需要分析中断例程
4. 需要分析一个应用程序和它的共享库
5. 需要分析所支持虚拟机的动态编译代码(JIT code)
6. 需要获取整个系统的性能数据
7. 需要检验硬件能力,比如缓存未命中(cache misses)
8. 需要详细的源代码性能分析(OProfile可以在源代码上标注性能计数)
9. 需要指令级别的分析
10. 需要调用图分析(call-graph)
当然, OProfile也不是解决所有问题的银弹,当你有以下需求时, 光靠OProfile可能不够:
1. 在非linux2.6/x86平台上进行调用图(call graph)分析
2. 在没有root权限的情况下进行分析
3. 需要100%精确指令级别的分析(汇编语言)
4. 需要函数调用计数或者间隙分析API(interstitial profiling API)
5. 任何情况下都不能对系统产生影响(或干扰)
6. 在不支持的虚拟机分析动态编译的代码
OProfile包含了一系列的工具,下面是这些工具的介绍。
ophelp
该工具列出(当前机器)可用的事件及其介绍;
opcontrol
用以OProfile(性能)数据采集,主要的工作模块之一;
agent libraries
被虚拟机用来记录关于动态编译代码(JITed code)的信息;
opreport
用以显示分析数据(结果)的超有用的工具;
opannotate
这个工具可以根据opcontrol采集的数据在源代码上做相应的注释,用以显示每段代码(甚至每行代码)的效率,支持汇编,C/C++或者C/C++混合代码。前提是被分析文件必须在编译的时候包含调试信息(比如g++的-g选项)。