Red Hat Training

A Red Hat training course is available for RHEL 8

第 19 章 使用 perf 记录和分析性能配置集

perf 工具允许您记录性能数据并稍后进行分析。

先决条件

19.1. perf 记录的目的

perf record 命令对性能数据进行样本,并将其保存在文件 perf.data 中,该文件可与其他 perf 命令读取和视觉化。perf.data 是在当前目录中生成的,可以在以后访问,可能在其他计算机上访问。

如果您没有为 perf record 指定在安装过程中记录的命令,它将记录,直到您通过按 Ctrl+C 手动停止该进程为止。您可以将 perf record 附加到特定进程,方法是传递 -p 选项后跟一个或多个进程 ID。您可以在没有 root 访问权限的情况下运行 perf record,但是这样做只会在用户空间中示例性能数据。在默认模式中,perf record 将 CPU 周期用作抽样事件,并在启用了继承模式的每线程模式中运行。

19.2. 在没有 root 访问权限的情况下记录性能配置集

您可以在没有 root 访问权限的情况下使用 perf record,只用于用户空间中的示例和记录性能数据。

先决条件

流程

  • 示例并记录性能数据:

    $ perf record command

    使用您要在其中示例数据的命令替换 command。如果您没有指定命令,则 perf record Ctrl+C

附加资源

  • perf-record(1) man page

19.3. 使用 root 访问权限记录性能配置集

您可以在 root 访问权限中使用 perf record 来同时在用户空间和内核空间中对性能数据进行抽样和记录。

先决条件

流程

  • 示例并记录性能数据:

    # perf record command

    使用您要在其中示例数据的命令替换 command。如果您没有指定命令,则 perf record Ctrl+C

附加资源

  • perf-record(1) man page

19.4. 以每个 CPU 模式记录性能配置集

您可以在被监控 CPU 上的所有线程中同时使用 perf record 在每个 CPU 模式中对用户空间和内核空间的性能数据进行抽样和记录。默认情况下,按 CPU 模式监控所有在线 CPU。

先决条件

流程

  • 示例并记录性能数据:

    # perf record -a command

    使用您要在其中示例数据的命令替换 command。如果您没有指定命令,则 perf record Ctrl+C

其它资源

  • perf-record(1) man page

19.5. 使用 perf 记录捕获调用图形数据

您可以配置 perf record 工具,以便记录哪些功能在性能配置集中调用其他功能。这有助于识别多个进程调用同一功能时的瓶颈。

先决条件

流程

  • 使用 --call-graph 选项的示例和记录性能数据:

    $ perf record --call-graph method command
    • 使用您要在其中示例数据的命令替换 command。如果您没有指定命令,则 perf record Ctrl+C
    • 使用以下解压缩方法之一替换方法

      fp
      使用帧指针方法。根据编译器优化,比如使用 GCC 选项 --fomit-frame-pointer 构建的二进制文件,这可能无法取消堆栈。
      dwarf
      使用 DWARF 调用信息来取消堆栈。
      lbr
      在 Intel 处理器上使用最后一个分支记录硬件。

其它资源

  • perf-record(1) man page

19.6. 使用 perf 报告分析 perf.data

您可以使用 perf report 显示和分析 perf.data 文件。

先决条件

  • 已安装 perf 用户空间工具。如需更多信息,请参阅安装 perf
  • 当前目录中有一个 perf.data 文件。
  • 如果 perf.data 文件是使用 root 访问权限创建的,则需要同时使用 root 访问权限运行 perf report

流程

  • 显示 perf.data 文件的内容以进行进一步分析:

    # perf report

    这个命令会显示类似如下的输出:

    Samples: 2K of event 'cycles', Event count (approx.): 235462960
    Overhead  Command          Shared Object                     Symbol
       2.36%  kswapd0          [kernel.kallsyms]                 [k] page_vma_mapped_walk
       2.13%  sssd_kcm         libc-2.28.so                      [.] memset_avx2_erms 2.13% perf [kernel.kallsyms] [k] smp_call_function_single 1.53% gnome-shell libc-2.28.so [.] strcmp_avx2
       1.17%  gnome-shell      libglib-2.0.so.0.5600.4           [.] g_hash_table_lookup
       0.93%  Xorg             libc-2.28.so                      [.] memmove_avx_unaligned_erms 0.89% gnome-shell libgobject-2.0.so.0.5600.4 [.] g_object_unref 0.87% kswapd0 [kernel.kallsyms] [k] page_referenced_one 0.86% gnome-shell libc-2.28.so [.] memmove_avx_unaligned_erms
       0.83%  Xorg             [kernel.kallsyms]                 [k] alloc_vmap_area
       0.63%  gnome-shell      libglib-2.0.so.0.5600.4           [.] g_slice_alloc
       0.53%  gnome-shell      libgirepository-1.0.so.1.0.0      [.] g_base_info_unref
       0.53%  gnome-shell      ld-2.28.so                        [.] _dl_find_dso_for_object
       0.49%  kswapd0          [kernel.kallsyms]                 [k] vma_interval_tree_iter_next
       0.48%  gnome-shell      libpthread-2.28.so                [.] pthread_getspecific 0.47% gnome-shell libgirepository-1.0.so.1.0.0 [.] 0x0000000000013b1d 0.45% gnome-shell libglib-2.0.so.0.5600.4 [.] g_slice_free1 0.45% gnome-shell libgobject-2.0.so.0.5600.4 [.] g_type_check_instance_is_fundamentally_a 0.44% gnome-shell libc-2.28.so [.] malloc 0.41% swapper [kernel.kallsyms] [k] apic_timer_interrupt 0.40% gnome-shell ld-2.28.so [.] _dl_lookup_symbol_x 0.39% kswapd0 [kernel.kallsyms] [k] raw_callee_save___pv_queued_spin_unlock

附加资源

  • perf-report(1) man page

19.7. perf 报告输出的解读

运行 perf report 命令显示的表将数据分为几个列:

'Overhead' 列
指明在该特定功能中收集总样本的百分比。
'Command' 列
告诉您从哪个进程收集样本。
"共享对象"列
显示样本来自的 ELF 镜像的名称(样本来自内核时使用名称 [kernel.kallsyms])。
'Symbol' 列
显示函数名称或符号。

在默认模式中,函数按照降序排列,其开销最先显示。

19.8. 生成可在不同设备中读取的 perf.data 文件

您可以使用 perf 工具将性能数据记录到要在不同设备中分析的 perf.data 文件中。

先决条件

流程

  1. 捕获您有兴趣进一步调查的性能数据:

    # perf record -a --call-graph fp sleep seconds

    这个示例将在整个系统中根据 sleep 命令的规定在 seconds 秒内生成 perf.data。它还将使用帧指针方法捕获调用图形数据。

  2. 生成包含记录数据的调试符号的归档文件:

    # perf archive

验证步骤

  • 验证归档文件是否已在当前活跃目录中生成:

    # ls perf.data*

    输出将显示当前目录中以 perf.data 开头的每个文件。归档文件将命名为:

    perf.data.tar.gz

    或者

    perf data.tar.bz2

19.9. 分析在不同设备中创建的 perf.data 文件

您可以使用 perf 工具分析在不同设备中生成的 perf.data 文件。

先决条件

流程

  1. perf.data 文件和归档文件复制到您当前的活跃目录中。
  2. 将存档文件提取到 ~/.debug

    # mkdir -p ~/.debug
    # tar xf perf.data.tar.bz2 -C ~/.debug
    注意

    归档文件也可能命名为 perf.data.tar.gz

  3. 打开 perf.data 文件进行进一步分析:

    # perf report

19.10. 为什么 perf 显示一些功能名称作为原始函数地址

对于内核函数,perf 使用 /proc/kallsyms 文件中的信息将示例映射到对应的功能名称或符号。但是,对于在用户空间中执行的功能,您可能会看到原始功能地址,因为二进制已被剥离。

必须安装可执行文件的 debuginfo 软件包,如果可执行文件是本地开发的应用程序,则必须编译应用程序并打开调试信息(GCC 中的 -g 选项)以显示在这种情况下的功能名称或符号。

注意

安装与可执行文件关联的 debuginfo 后,不需要重新运行 perf record 命令。只需重新运行 perf report 命令。

19.11. 启用 debug 和源存储库

Red Hat Enterprise Linux 的标准安装不会启用 debug 和源存储库。这些存储库包含调试系统组件和衡量其性能所需的信息。

流程

  • 启用源和调试信息软件包频道:

    # subscription-manager repos --enable rhel-8-for-$(uname -i)-baseos-debug-rpms
    # subscription-manager repos --enable rhel-8-for-$(uname -i)-baseos-source-rpms
    # subscription-manager repos --enable rhel-8-for-$(uname -i)-appstream-debug-rpms
    # subscription-manager repos --enable rhel-8-for-$(uname -i)-appstream-source-rpms

    $(uname -i) 部分自动替换为您的系统构架的匹配值:

    架构名称

    64 位 Intel 和 AMD

    x86_64

    64-bit ARM

    aarch64

    IBM POWER

    ppc64le

    64-bit IBM Z

    s390x

19.12. 使用 GDB 为应用程序或库获取 debuginfo 软件包

调试信息需要调试信息。对于从软件包安装的代码,GNU Debugger(GDB)会自动识别缺少的调试信息,解决软件包名称并提供了有关如何获取软件包的具体建议。

先决条件

  • 您要调试的应用程序或库必须安装在系统上。
  • GDB 和 debuginfo-install 工具必须安装在系统中。详情请查看 设置调试应用程序
  • 在系统中必须配置并启用提供 debuginfodebugsource 软件包的频道。

流程

  1. 启动附加到您要调试的应用程序或库的 GDB。GDB 自动识别缺少的调试信息,并建议运行 命令。

    $ gdb -q /bin/ls
    Reading symbols from /bin/ls...Reading symbols from .gnu_debugdata for /usr/bin/ls...(no debugging symbols found)...done.
    (no debugging symbols found)...done.
    Missing separate debuginfos, use: dnf debuginfo-install coreutils-8.30-6.el8.x86_64
    (gdb)
  2. 退出 GDB: 键入 q,然后使用 Enter 进行确认

    (gdb) q
  3. 运行 GDB 建议的命令安装所需的 debuginfo 软件包:

    # dnf debuginfo-install coreutils-8.30-6.el8.x86_64

    dnf 软件包管理工具提供更改概述,询问确认,下载并安装所有必要的文件。

  4. 如果 GDB 无法推荐 debuginfo 软件包,请按照手动为应用程序或库获取 debuginfo 软件包的步骤进行操作