Red Hat Training

A Red Hat training course is available for RHEL 8

第 17 章 使用 perf top 实时分析 CPU 使用情况

您可以使用 perf top 命令实时测量不同功能的 CPU 使用情况。

先决条件

17.1. perf top 的目的

perf top 命令用于实时系统性能分析,功能与 top 工具类似。但是,top 工具通常显示给定进程或线程使用的 CPU 时间,perf top 显示每个特定功能使用的 CPU 时间。在默认状态下,perf top 告知您用户空间和内核空间的所有 CPU 中使用的功能。要使用 perf top,您需要 root 访问权限。

17.2. 使用 perf top 分析 CPU 使用率

此流程实时激活 perf top 和配置集 CPU 使用情况。

先决条件

流程

  • 启动 perf top 监控接口:

    # perf top

    监控接口类似如下:

    --------------------------------------------------------------------
    PerfTop:   20806 irqs/sec  kernel:57.3%  exact: 100.0% lost: 0/0 drop: 0/0 [4000Hz cycles],  (all, 8 CPUs)
    ---------------------------------------------------------------------
    Overhead  Shared Object       Symbol
       2.20%  [kernel]            [k] do_syscall_64
       2.17%  [kernel]            [k] module_get_kallsym
       1.49%  [kernel]            [k] copy_user_enhanced_fast_string
       1.37%  libpthread-2.29.so  [.] pthread_mutex_lock 1.31% [unknown] [.] 0000000000000000 1.07% [kernel] [k] psi_task_change 1.04% [kernel] [k] switch_mm_irqs_off 0.94% [kernel] [k] fget
       0.74%  [kernel]            [k] entry_SYSCALL_64
       0.69%  [kernel]            [k] syscall_return_via_sysret
       0.69%  libxul.so           [.] 0x000000000113f9b0
       0.67%  [kernel]            [k] kallsyms_expand_symbol.constprop.0
       0.65%  firefox             [.] moz_xmalloc
       0.65%  libpthread-2.29.so  [.] __pthread_mutex_unlock_usercnt
       0.60%  firefox             [.] free
       0.60%  libxul.so           [.] 0x000000000241d1cd
       0.60%  [kernel]            [k] do_sys_poll
       0.58%  [kernel]            [k] menu_select
       0.56%  [kernel]            [k] _raw_spin_lock_irqsave
       0.55%  perf                [.] 0x00000000002ae0f3

    在这个示例中,内核功能 do_syscall_64 使用最多 CPU 时间。

其它资源

  • perf-top(1) man page

17.3. perf 最高输出的解读

perf top 监控界面在几个列中显示数据:

"Overhead"列
显示给定功能正在使用的 CPU 百分比。
"共享对象"列
显示使用 函数的程序或库的名称。
"Symbol"列
显示函数名称或符号。内核空间中执行的功能由 [k] 标识,用户空间执行的功能由 [.] 标识。

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

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

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

注意

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

17.5. 启用 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

17.6. 使用 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 软件包的步骤进行操作