跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文档 / 系统分析和微调指南 / 内核监视 / OProfile — 系统范围的探查器
适用范围 SUSE Linux Enterprise Server 15 SP2

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

探查器工具。例如,在探查停止后,opreport 可以处理默认储存在 CUR_DIR/oprofile_data/samples/current 中的数据。

ophelp

列出可用事件和简短说明。

opimport

将样本数据库文件从外部二进制格式转换为本机格式。

opreport

基于探查到的数据生成报告。

7.4 使用 OProfile

使用 OProfile 可以探查内核和应用程序。探查内核时,请告知 OProfile 要在何处查找 vmlinuz* 文件。使用 --vmlinux 选项并将其指向 vmlinuz*(通常位于 /boot 中)。如果您需要探查内核模块,OProfile 默认便会执行此操作。但是,请务必阅读 http://oprofile.sourceforge.net/doc/kernel-profiling.html

应用程序通常不需要探查内核,因此您应该使用 --no-vmlinux 选项来减少信息量。

7.4.1 创建报告

启动守护程序、收集数据、停止守护程序,并创建应用程序 COMMAND 的报告。

  1. root 用户身份打开外壳并登录。

  2. 确定是要探查还是不探查 Linux 内核:

    1. 探查 Linux 内核: 执行以下命令,因为 operf 只能处理未压缩的映像:

      tux > cp /boot/vmlinux-`uname -r`.gz /tmp
      tux > gunzip /tmp/vmlinux*.gz
      tux > operf--vmlinux=/tmp/vmlinux* COMMAND
    2. 不探查 Linux 内核: 使用以下命令:

      root # operf --no-vmlinux COMMAND

      要在输出中查看哪些函数调用了其他函数,请额外使用 --callgraph 选项并设置最大 DEPTH

      root # operf --no-vmlinux --callgraph
      DEPTH COMMAND
  3. operf 将其数据写入 CUR_DIR/oprofile_data/samples/currentoperf 命令完成(或者由 CtrlC 中止)后,即可使用 oreport 分析数据:

    root # 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 获取事件配置

事件配置的一般过程如下:

  1. 首先使用事件 CPU-CLK_UNHALTEDINST_RETIRED 找到优化机会。

  2. 使用特定的事件查找瓶颈。要列出瓶颈,请使用命令 perf list

如果您需要探查特定的事件,请先使用 ophelp 命令查看处理器支持的可用事件(从 Intel Core i5 CPU 生成的示例输出):

root # 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 获得)和采样率,例如:

root # operf --events CPU_CLK_UNHALTED:100000
警告
警告:使用 CPU_CLK_UNHALTED 设置采样率

设置较低的采样率可能会严重影响系统性能,而设置较高的采样率可能会给系统造成较大程度的干扰,导致数据无用。建议微调要使用和不使用 OProfile 监视的性能度量,并通过试验来确定对性能干扰最轻的最小采样率。

7.5 生成报告

在生成报告之前,请确保 operf 已停止。除非您已使用 --session-dir 提供了输出目录,否则 operf 会将其数据写入 CUR_DIR/oprofile_data/samples/current,因而报告工具 opreportopannotate 默认会在此位置查找数据。

不使用任何选项调用 opreport 可以提供完整摘要。使用某个可执行文件作为参数,检索仅来自于此可执行文件的探查数据。如果您要分析以 C++ 编写的应用程序,请使用 --demangle smart 选项。

opannotate 生成的输出包含源代码中的批注。结合使用以下选项运行此命令:

root # opannotate --source \
   --base-dirs=BASEDIR \
   --search-dirs=SEARCHDIR \
   --output-dir=annotated/ \
   /lib/libfoo.so

选项 --base-dir 包含从调试源文件拆分出的路径逗号分隔列表。在 --search-dirs 中查找之前已搜索过这些路径。--search-dirs 选项也是一个用于搜索源文件的目录逗号分隔列表。

注意
注意:带批注源代码中的不准确性

由于编译器优化,代码可能会消失或显示在不同的位置。参考 http://oprofile.sourceforge.net/doc/debug-info.html 中的信息可以全面了解这种行为的含义。

7.6 更多信息

本章仅提供了简短概述。有关详细信息,请参考以下链接:

http://oprofile.sourceforge.net

项目主页。

手册页

有关不同工具的选项的详细说明。

/usr/share/doc/packages/oprofile/oprofile.html

包含 OProfile 手册。

http://developer.intel.com/

Intel 处理器的体系结构参考。

https://www.ibm.com/support/knowledgecenter/ssw_aix_71/assembler/idalangref_arch_overview.html

IBM iSeries、pSeries 和 Blade 服务器系统中 PowerPC64 处理器的体系结构参考。