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 生成的示例输出):
#
ophelp
oprofile: 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:100000
CPU_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 处理器的体系结构参考。