Red Hat Training

A Red Hat training course is available for RHEL 8

第 22 章 使用 perf mem 分析内存访问

您可以使用 perf mem 命令示例系统中的内存访问。

22.1. perf mem 的目的

perf 工具的 mem 子命令允许对内存访问进行抽样(负载和存储)。perf mem 命令提供有关内存延迟、内存访问类型、导致缓存命中和丢失的功能的信息,并通过记录数据符号,记录这些命中和丢失的内存位置。

22.2. 使用 perf mem 对内存进行抽样访问

这个步骤描述了如何使用 perf mem 命令对系统中内存访问进行示例。命令采用与 perf recordperf report 相同的选项,以及专用于 mem 子命令的一些选项。记录的数据保存在当前目录中的 perf.data 文件中,以便稍后进行分析。

先决条件

流程

  1. 内存访问示例:

    # perf mem record -a sleep seconds

    这个示例根据 sleep 命令的规定,在所有 CPU 间访问内存时长为秒。您可以为要示例内存访问数据的任何命令替换 sleep 命令。默认情况下,perf mem 对内存负载和存储的示例。您只能使用 -t 选项选择一个内存操作,并在 perf memrecord 之间指定 "load" 或 "store"。对于负载,捕获内存层次结构级别的信息、TLB 内存访问、总线侦听和内存锁定。

  2. 打开 perf.data 文件进行分析:

    # perf mem report

    如果您使用了示例命令,输出为:

    Available samples
    35k cpu/mem-loads,ldlat=30/P
    54k cpu/mem-stores/P

    cpu/mem-loads,ldlat=30/P 行表示通过内存负载收集的数据,cpu/mem-stores/P 行表示通过内存存储收集的数据。突出显示相关类别并按 Enter 查看数据:

    Samples: 35K of event 'cpu/mem-loads,ldlat=30/P', Event count (approx.): 4067062
    Overhead       Samples  Local Weight  Memory access             Symbol                                                                 Shared Object                 Data Symbol                                                     Data Object                            Snoop         TLB access              Locked
       0.07%            29  98            L1 or L1 hit              [.] 0x000000000000a255                                                 libspeexdsp.so.1.5.0          [.] 0x00007f697a3cd0f0                                          anon                                   None          L1 or L2 hit            No
       0.06%            26  97            L1 or L1 hit              [.] 0x000000000000a255                                                 libspeexdsp.so.1.5.0          [.] 0x00007f697a3cd0f0                                          anon                                   None          L1 or L2 hit            No
       0.06%            25  96            L1 or L1 hit              [.] 0x000000000000a255                                                 libspeexdsp.so.1.5.0          [.] 0x00007f697a3cd0f0                                          anon                                   None          L1 or L2 hit            No
       0.06%             1  2325          Uncached or N/A hit       [k] pci_azx_readl                                                      [kernel.kallsyms]             [k] 0xffffb092c06e9084                                          [kernel.kallsyms]                      None          L1 or L2 hit            No
       0.06%             1  2247          Uncached or N/A hit       [k] pci_azx_readl                                                      [kernel.kallsyms]             [k] 0xffffb092c06e8164                                          [kernel.kallsyms]                      None          L1 or L2 hit            No
       0.05%             1  2166          L1 or L1 hit              [.] 0x00000000038140d6                                                 libxul.so                     [.] 0x00007ffd7b84b4a8                                          [stack]                                None          L1 or L2 hit            No
       0.05%             1  2117          Uncached or N/A hit       [k] check_for_unclaimed_mmio                                           [kernel.kallsyms]             [k] 0xffffb092c1842300                                          [kernel.kallsyms]                      None          L1 or L2 hit            No
       0.05%            22  95            L1 or L1 hit              [.] 0x000000000000a255                                                 libspeexdsp.so.1.5.0          [.] 0x00007f697a3cd0f0                                          anon                                   None          L1 or L2 hit            No
       0.05%             1  1898          L1 or L1 hit              [.] 0x0000000002a30e07                                                 libxul.so                     [.] 0x00007f610422e0e0                                          anon                                   None          L1 or L2 hit            No
       0.05%             1  1878          Uncached or N/A hit       [k] pci_azx_readl                                                      [kernel.kallsyms]             [k] 0xffffb092c06e8164                                          [kernel.kallsyms]                      None          L2 miss                 No
       0.04%            18  94            L1 or L1 hit              [.] 0x000000000000a255                                                 libspeexdsp.so.1.5.0          [.] 0x00007f697a3cd0f0                                          anon                                   None          L1 or L2 hit            No
       0.04%             1  1593          Local RAM or RAM hit      [.] 0x00000000026f907d                                                 libxul.so                     [.] 0x00007f3336d50a80                                          anon                                   Hit           L2 miss                 No
       0.03%             1  1399          L1 or L1 hit              [.] 0x00000000037cb5f1                                                 libxul.so                     [.] 0x00007fbe81ef5d78                                          libxul.so                              None          L1 or L2 hit            No
       0.03%             1  1229          LFB or LFB hit            [.] 0x0000000002962aad                                                 libxul.so                     [.] 0x00007fb6f1be2b28                                          anon                                   None          L2 miss                 No
       0.03%             1  1202          LFB or LFB hit            [.] __pthread_mutex_lock                                               libpthread-2.29.so            [.] 0x00007fb75583ef20                                          anon                                   None          L1 or L2 hit            No
       0.03%             1  1193          Uncached or N/A hit       [k] pci_azx_readl                                                      [kernel.kallsyms]             [k] 0xffffb092c06e9164                                          [kernel.kallsyms]                      None          L2 miss                 No
       0.03%             1  1191          L1 or L1 hit              [k] azx_get_delay_from_lpib                                            [kernel.kallsyms]             [k] 0xffffb092ca7efcf0                                          [kernel.kallsyms]                      None          L1 or L2 hit            No

    或者,您可以对结果进行排序,以调查显示数据时感兴趣的不同方面。例如,要按抽样期间发生的内存访问类型对内存负载进行排序,请按它们所考虑的开销降序排列:

    # perf mem -t load report --sort=mem

    例如,输出可以是:

    Samples: 35K of event 'cpu/mem-loads,ldlat=30/P', Event count (approx.): 40670
    Overhead       Samples  Memory access
      31.53%          9725  LFB or LFB hit
      29.70%         12201  L1 or L1 hit
      23.03%          9725  L3 or L3 hit
      12.91%          2316  Local RAM or RAM hit
       2.37%           743  L2 or L2 hit
       0.34%             9  Uncached or N/A hit
       0.10%            69  I/O or N/A hit
       0.02%           825  L3 miss

其它资源

  • perf-mem(1) man 手册.

22.3. perf mem 报告输出的解读

运行不带修饰符的 perf mem report 命令显示的表,可将数据分为几个列:

'Overhead' 列
表示特定功能中收集的整体样本的百分比。
'Samples' 列
显示按该行划分的示例数量。
'Local Weight' 列
显示处理器核心周期的访问延迟。
'Memory Access' 列
显示发生的内存访问类型。
'Symbol' 列
显示函数名称或符号。
"共享对象"列
显示样本来自的 ELF 镜像的名称(样本来自内核时使用名称 [kernel.kallsyms])。
"Data Symbol"列
显示所在行所针对的内存位置的地址。
重要

通常,由于被访问的内存或堆栈内存的动态分配,"数据 Symbol"列将显示原始地址。

"Snoop"列
显示总线事务.
'TLB Access' 列
显示 TLB 内存访问。
'Locked' 列
指示函数是否已被锁定或未锁定内存。

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