7 OProfile — 系统范围的分析器 #
OProfile 是用于动态程序分析的分析器。它可以调查运行中程序的行为并收集信息。您可以查看这些信息,并从中获得用于进一步优化的提示。
无需重新编译或使用封装程序库即可使用 OProfile。甚至不需要内核补丁。在分析应用程序时,开销应该比较低,具体取决于工作负载和采样频率。
7.1 概念概述 #
OProfile 由一个内核驱动程序以及一个用于收集数据的守护程序构成。它使用许多处理器上都会提供的硬件性能计数器。OProfile 能够分析所有代码,包括内核、内核模块、内核中断处理程序、系统共享库和其他应用程序。
新式处理器支持通过硬件由性能计数器执行分析。根据所用的处理器,可能会提供许多计数器,可以使用要计入的事件对每个计数器进行编程。每个计数器都有一个值来确定采样频率。值越小,则使用样本的频率越高。
在执行后处理步骤期间,将收集所有信息,并将指令地址映射到某个函数名称。
7.2 安装和要求 #
   要使用 OProfile,请安装 oprofile 软件包。OProfile 可在 AMD64/Intel 64、IBM Z 和 POWER 处理器上运行。
   为您要分析的相关应用程序安装 *-debuginfo 软件包非常有用。要分析内核,还需要安装 debuginfo 软件包。
  
7.3 可用的 OProfile 实用程序 #
OProfile 包含多个实用程序,用于处理分析进程及其分析的数据。以下列表简要汇总了本章中使用的程序:
- opannotate
- 输出带批注的源代码或程序集列表(混合了分析信息)。可将带批注的报告与 - addr2line结合使用,以识别可能存在热点的源文件和行。有关更多信息,请参见- man addr2line。
- operf
- 分析器工具。例如,分析停止后,默认存储在 - CUR_DIR/oprofile_data/samples/current中的数据可由- opreport处理。
- ophelp
- 列出可用事件和简短说明。 
- opimport
- 将样本数据库文件从外部二进制格式转换为专用于平台的格式。 
- opreport
- 基于分析的数据生成报告。 
7.4 使用 OProfile #
   使用 OProfile 可以分析内核和应用程序。分析内核时,请告知 OProfile 要在何处查找 vmlinuz* 文件。使用 --vmlinux 选项并将其指向 vmlinuz*(一般位于 /boot 中)。如果您需要分析内核模块,OProfile 默认便会执行此操作。但是,请务必阅读 https://oprofile.sourceforge.net/doc/kernel-profiling.html。
  
   大多数应用程序不需要分析内核,因此您应该使用 --no-vmlinux 选项来减少信息量。
  
7.4.1 创建报告 #
启动守护程序、收集数据、停止守护程序,并创建应用程序 COMMAND 的报告。
- 打开外壳,并以 - root身份登录。
- 确定是要分析还是不分析 Linux 内核: - 分析 Linux 内核: 执行以下命令,因为 - operf只能处理未压缩的映像:- >cp /boot/vmlinux-`uname -r`.gz /tmp- >gunzip /tmp/vmlinux*.gz- >operf--vmlinux=/tmp/vmlinux* COMMAND
- 不分析 Linux 内核: 使用以下命令: - #operf --no-vmlinux COMMAND- 要在输出中查看哪些函数调用了其他函数,请额外使用 - --callgraph选项并设置最大 DEPTH:- #operf --no-vmlinux --callgraph DEPTH COMMAND
 
- operf将其数据写入- CUR_DIR/oprofile_data/samples/current。- operf命令完成(或者由 Ctrl–C 中止)后,即可使用- oreport分析数据:- #opreport Overflow stats not available CPU: CPU with timer interrupt, speed 0 MHz (estimated) Profiling through timer interrupt TIMER:0| samples| %| ------------------ 84877 98.3226 no-vmlinux ...
7.4.2 获取事件配置 #
事件配置的一般过程如下:
- 首先使用事件 - CPU-CLK_UNHALTED和- INST_RETIRED找到优化机会。
- 使用特定的事件查找瓶颈。要列出事件,请使用命令 - perf list。
    如果您需要分析特定的事件,请先使用 ophelp 命令查看处理器支持的可用事件(从 Intel Core i5 CPU 生成的示例输出):
   
#ophelpoprofile: available events for CPU type "Intel Architectural Perfmon" See Intel 64 and IA-32 Architectures Software Developer's Manual Volume 3B (Document 253669) Chapter 18 for architectural perfmon events This is a limited set of fallback events because oprofile does not know your CPU CPU_CLK_UNHALTED: (counter: all)) Clock cycles when not halted (min count: 6000) INST_RETIRED: (counter: all)) number of instructions retired (min count: 6000) LLC_MISSES: (counter: all)) Last level cache demand requests from this core that missed the LLC (min count: 6000) Unit masks (default 0x41) ---------- 0x41: No unit mask LLC_REFS: (counter: all)) Last level cache demand requests from this core (min count: 6000) Unit masks (default 0x4f) ---------- 0x4f: No unit mask BR_MISS_PRED_RETIRED: (counter: all)) number of mispredicted branches retired (precise) (min count: 500)
    使用选项 --event 指定性能计数器事件。可以使用多个选项。此选项需要事件名称(通过 ophelp 获得)和采样率,例如:
   
# operf --events CPU_CLK_UNHALTED:100000CPU_CLK_UNHALTED 设置采样率设置较低的采样率可能会严重影响系统性能,而设置较高的采样率可能会给系统造成较大程度的干扰,导致数据无用。建议微调要使用和不使用 OProfile 监控的性能指标,并通过试验来确定对性能产生的干扰最轻的最小采样率。
7.5 生成报告 #
   在生成报告之前,请确保 operf 已停止。除非您已使用 --session-dir 提供了输出目录,否则 operf 会将其数据写入 CUR_DIR/oprofile_data/samples/current,并且报告工具 opreport 和 opannotate 默认会在此位置查找数据。
  
   不使用任何选项调用 opreport 可以提供完整摘要。使用某个可执行文件作为参数,检索仅来自于此可执行文件的分析数据。如果您要分析以 C++ 编写的应用程序,请使用 --demangle smart 选项。
  
opannotate 生成的输出包含源代码中的批注。结合使用以下选项运行此命令:
  
#opannotate--source \ --base-dirs=BASEDIR \ --search-dirs=SEARCHDIR \ --output-dir=annotated/ \ /lib/libfoo.so
   选项 --base-dir 包含从调试源文件拆分出的路径逗号分隔列表。在 --search-dirs 中查找前已搜索过这些路径。--search-dirs 选项也是一个用于搜索源文件的目录逗号分隔列表。
  
由于编译器优化功能,代码可能会消失或显示在不同的位置。参考 https://oprofile.sourceforge.net/doc/debug-info.html 中的信息可以全面了解这种行为的含义。
7.6 更多信息 #
本章仅提供了简短概述。有关详细信息,请参考以下链接:
- https://oprofile.sourceforge.net
- 项目主页。 
- 手册页
- 有关不同工具的选项的详细说明。 
- /usr/share/doc/packages/oprofile/oprofile.html
- 包含 OProfile 手册。 
- https://developer.intel.com/
- Intel 处理器的体系结构参考。 
- https://www.ibm.com/support/knowledgecenter/ssw_aix_71/assembler/idalangref_arch_overview.html
- IBM iSeries、pSeries 和 Blade 服务器系统中 PowerPC64 处理器的体系结构参考。