Red Hat Training

A Red Hat training course is available for RHEL 8

第 21 章 使用 perf 监控应用程序性能

本节论述了如何使用 perf 工具监控应用程序性能。

21.1. 将 perf 记录附加到正在运行的进程

您可以将 perf record 附加到正在运行的进程。这将指示 perf record 仅对指定进程中的性能数据进行抽样和记录。

先决条件

流程

  • perf record 附加到正在运行的进程:

    $ perf record -p ID1,ID2 sleep seconds

    前面的示例示例并记录了带有进程 ID ID1ID2 的进程的性能数据,时间跨度为 seconds 秒,使用 sleep 命令指定。您还可以配置 perf 以记录特定线程中的事件:

    $ perf record -t ID1,ID2 sleep seconds
    注意

    当使用 -t 标志并强制处理线程 ID 时,perf 默认禁用继承。您可以通过添加 --inherit 选项来启用继承。

21.2. 使用 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

21.3. 使用 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