4.7.3. perf

perf 是一个开源的性能分析工具,用于 Linux 系统的性能监控和分析。它提供了多种子命令,用于不同的性能分析场景,例如记录、分析、统计等。

4.7.3.1. 语法说明

以下是执行 perf –help 输出的 Usage:

usage: perf [--version] [--help] [OPTIONS] COMMAND [ARGS]

4.7.3.2. 参数选项说明

perf 支持多种子命令,每个子命令都有其特定的用途。以下是一些常用的子命令及其说明:

annotate
   作用:解析 perf record 生成的 perf.data 文件,显示被注释的代码。
archive
   作用:根据数据文件记录的 build-id,将所有被采样到的 elf 文件打包。利用此压缩包,可以再任何机器上分析数据文件中记录的采样数据。
bench
   作用: perf 中内置的 benchmark,目前包括两套针对调度器和内存管理子系统的 benchmark。
buildid-cache
   作用:管理 perf  buildid 缓存,每个 elf 文件都有一个独一无二的 buildid。 buildid  perf 用来关联性能数据与 elf 文件。
buildid-list
   作用:列出数据文件中记录的所有 buildid。
diff
   作用:对比两个数据文件的差异。能够给出每个符号(函数)在热点分析上的具体差异。
evlist
   作用:列出数据文件 perf.data 中所有性能事件。
inject
   作用:该工具读取 perf record 工具记录的事件流,并将其定向到标准输出。在被分析代码中的任何一点,都可以向事件流中注入其它事件。
kmem
   作用:针对内核内存( slab)子系统进行追踪测量的工具
kvm
   作用:用来追踪测试运行在 KVM 虚拟机上的 Guest OS。
list
   作用:列出当前系统支持的所有性能事件。包括硬件性能事件、软件性能事件以及检查点。
lock
   作用:分析内核中的锁信息,包括锁的争用情况,等待延迟等。
mem
   作用:内存存取情况
record
   作用:收集采样信息,并将其记录在数据文件中。随后可通过其它工具对数据文件进行分析。
report
   作用:读取 perf record 创建的数据文件,并给出热点分析结果。
sched
   作用:针对调度器子系统的分析工具。
script
   作用:执行 perl  python 写的功能扩展脚本、生成脚本框架、读取数据文件中的数据信息等。
stat
   作用:执行某个命令,收集特定进程的性能概况,包括 CPI、 Cache 丢失率等。
test
   作用: perf 对当前软硬件平台进行健全性测试,可用此工具测试当前的软硬件平台是否能支持 perf 的所有功能。
timechart
   作用:针对测试期间系统行为进行可视化的工具
top
   作用:类似于 linux  top 命令,对系统性能进行实时分析。
trace
   作用:关于 syscall 的工具。
probe
   作用:用于定义动态检查点。

全局性概况:

perf list
   作用:查看当前系统支持的性能事件。
perf bench
   作用:对系统性能进行摸底。
perf test
   作用:对系统进行健全性测试
perf stat
   作用:对全局性能进行统计

全局细节:

perf top
   作用:可以实时查看当前系统进程函数占用率情况。
perf probe
   作用:可以自定义动态事件。

特定功能分析:

perf kmem
   作用:针对 slab 子系统性能分析。
perf kvm
   作用:针对 kvm 虚拟化分析。
perf lock
   作用:分析锁性能。
perf mem
   作用:分析内存 slab 性能。
perf sched
   作用:分析内核调度器性能。
perf trace
   作用:记录系统调用轨迹。

常用功能 perf record :

可以系统全局,也可以具体到某个进程,更甚具体到某一进程某一事件;可宏观,也可以很微观。

perf record
   作用:记录信息到 perf.data。
perf report
   作用:生成报告。
perf diff
   作用:对两个记录进行 diff。
perf evlist
   作用:列出记录的性能事件。
perf annotate
   作用:显示 perf.data 函数代码。
perf archive
   作用:将相关符号打包,方便在其它机器进行分析。

可视化工具 perf timechart :

perf timechart record
   作用:记录事件。
perf timechart
   作用:生成 output.svg 文档。

4.7.3.3. 各项命令选项及其功能说明

perf 系统分析

命令:

root@buildroot:~# perf top

功能:

实时显示占用 CPU 时钟最多的函数或者指令(可以用来查找热点函数)。

打印输出:

  PerfTop:    1109 irqs/sec  kernel:58.4%  exact:  0.0% lost: 0/0 drop: 0/0 [4000Hz cycles],  (all, 8 CPUs)
-------------------------------------------------------------------------------------------------------------------------------------------------------------

     7.52%  perf              [.] 0x00000000000d7930
     5.45%  libc.so.6         [.] strchr
     5.23%  [kernel]          [k] format_decode
     5.15%  [kernel]          [k] number
     3.81%  [kernel]          [k] vsnprintf
     3.43%  [kernel]          [k] kallsyms_expand_symbol.constprop.0
     3.08%  [kernel]          [k] string
     2.16%  [kernel]          [k] module_get_kallsym
     2.03%  libc.so.6         [.] __libc_calloc
     1.60%  perf              [.] 0x00000000000e1974

字段解析:

  • 1109 irqs/sec:中断频率, 1109 次 / 秒。

  • kernel:内核态 CPU 占用‌: 58.4%。

  • exact:表示采样事件中精确匹配硬件计数器的事件比例,‌0.0% 表示所有事件均被准确记录‌。

  • lost: 采样过程中丢失的事件数(此处为 0 )。

  • drop: 内核因缓冲区溢出而主动丢弃的事件数(此处为 0 )

每一行包含四列,分别是:

  • Overhead:代表该符号的性能事件在所有采样中的比例,用百分比来表示。

  • Shared:代表该函数或指令所在的动态共享对象( Dynamic Shared Object),如内核、进程名、动态链接库名、内核模块名等。

  • Object:代表动态共享对象的类型。比如 [.] 表示用户空间的可执行程序、或者动态链接库,而 [k] 则表示内核空间。

  • Symbol:代表符号名,也就是函数名。当函数名未知时,用十六进制的地址来表示。

perf 事件类型

命令:

root@buildroot:~# perf list

功能:

查看 perf 所支持的性能事件,这些事件可用于性能监控。

打印输出

List of pre-defined events (to be used in -e or -M):

  branch-instructions OR branches                    [Hardware event]
  branch-misses                                      [Hardware event]
  bus-cycles                                         [Hardware event]
  cache-misses                                       [Hardware event]
  cache-references                                   [Hardware event]
  cpu-cycles OR cycles                               [Hardware event]
  instructions                                       [Hardware event]
  stalled-cycles-backend OR idle-cycles-backend      [Hardware event]
  stalled-cycles-frontend OR idle-cycles-frontend    [Hardware event]

  alignment-faults                                   [Software event]
  bpf-output                                         [Software event]
  cgroup-switches                                    [Software event]
  context-switches OR cs                             [Software event]
  cpu-clock                                          [Software event]
  cpu-migrations OR migrations                       [Software event]
  dummy                                              [Software event]
  emulation-faults                                   [Software event]
  major-faults                                       [Software event]
  minor-faults                                       [Software event]
  page-faults OR faults                              [Software event]
  task-clock                                         [Software event]

  duration_time                                      [Tool event]
  user_time                                          [Tool event]
  system_time                                        [Tool event]

  L1-dcache-load-misses                              [Hardware cache event]
  L1-dcache-loads                                    [Hardware cache event]
  L1-icache-load-misses                              [Hardware cache event]
  L1-icache-loads                                    [Hardware cache event]
  LLC-load-misses                                    [Hardware cache event]
  LLC-loads                                          [Hardware cache event]
  branch-load-misses                                 [Hardware cache event]
  branch-loads                                       [Hardware cache event]
  dTLB-load-misses                                   [Hardware cache event]
  dTLB-loads                                         [Hardware cache event]
  iTLB-load-misses                                   [Hardware cache event]
  iTLB-loads                                         [Hardware cache event]

  br_immed_retired OR armv8_pmuv3/br_immed_retired/  [Kernel PMU event]
  br_mis_pred OR armv8_pmuv3/br_mis_pred/            [Kernel PMU event]
  br_mis_pred_retired OR armv8_pmuv3/br_mis_pred_retired/ [Kernel PMU event]
  br_pred OR armv8_pmuv3/br_pred/                    [Kernel PMU event]
  br_retired OR armv8_pmuv3/br_retired/              [Kernel PMU event]
  br_return_retired OR armv8_pmuv3/br_return_retired/ [Kernel PMU event]

字段解析:

  • 硬件事件( Hardware Events)

    • 作用:直接使用 CPU 硬件性能计数器(统计底层硬件行为。

    • 关键事件:

      • cpu-cycles: CPU 时钟周期数(衡量计算密集型任务)。

      • instructions:已执行指令数(与 cycles 结合可计算 ‌IPC‌,即每周期指令数)。

      • branch-misses:分支预测失败次数(优化分支逻辑时关键指标)。

      • cache-misses:缓存未命中次数。

  • 软件事件( Software Events)

    • 作用:由内核模拟的抽象事件,不依赖硬件计数器。

    • 关键事件‌:

      • context-switches:上下文切换次数。

      • page-faults:缺页异常次数。

      • pu-migrations:进程在 CPU 核心间的迁移次数。

  • 硬件缓存事件( Hardware Cache Events)

    • 作用:统计 CPU 缓存层级( L1/L2/L3 )的行为。

    • ‌关键事件‌:

      • L1-dcache-load-misses: L1 数据缓存未命中次数。

      • LLC-load-misses:末级缓存( L3 )未命中次数(若高需优化内存访问连续性)。

      • iTLB-load-misses:指令 TLB 未命中次数。

  • 内核 PMU 事件( Kernel PMU Events)

    • 作用:与 CPU 架构相关的硬件事件。

    • 关键事件‌:

      • br_mis_pred_retired:已退休的错误预测分支指令数。

      • br_retired:已退休的分支指令总数(计算分支预测失败率)。

  • 工具事件( Tool Events)

    • 作用: perf 自身定义的抽象事件,用于统计时间分布。

    • 关键事件‌:

    • duration_time:总耗时。

    • user_time:用户态代码耗时。

    • system_time:内核态代码耗时。

指定性能事件:

  • e : u // userspace

  • e : k // kernel

  • e : h // hypervisor

  • e : G // guest counting (in KVM guests)

  • e : H // host counting (not in KVM guests)

命令:

root@buildroot:~# perf top -e cycles:k

功能:

显示内核和模块中,消耗最多 CPU 周期的函数。

打印输出:

   PerfTop:      48 irqs/sec  kernel:100.0%  exact:  0.0% lost: 0/0 drop: 0/0 [4000Hz cycles:k],  (all, 8 CPUs)
-------------------------------------------------------------------------------------------------------------------------------------------------------------

     9.72%  [kernel]       [k] format_decode
     8.56%  [kernel]       [k] number
     7.23%  [kernel]       [k] kallsyms_expand_symbol.constprop.0
     7.20%  [kernel]       [k] vsnprintf
     4.84%  [kernel]       [k] string
     4.33%  [kernel]       [k] module_get_kallsym
     2.71%  [kernel]       [k] finish_task_switch.isra.0
     2.62%  [kernel]       [k] mas_spanning_rebalance.isra.0
     2.16%  [kernel]       [k] _raw_spin_unlock_irqrestore
     1.82%  [kernel]       [k] memmove
     1.26%  [kernel]       [k] pointer
     1.23%  [kernel]       [k] mab_mas_cp
     1.17%  [kernel]       [k] update_iter
     1.09%  [kernel]       [k] strscpy
     1.09%  [kernel]       [k] __slab_free.constprop.0
     1.08%  [kernel]       [k] memset
     1.07%  [kernel]       [k] mtree_range_walk
     1.04%  [kernel]       [k] mas_descend_adopt
     0.80%  [kernel]       [k] rcu_cblist_dequeue
     0.80%  [kernel]       [k] kmem_cache_free
     0.79%  [kernel]       [k] seq_read_iter
     0.74%  [kernel]       [k] kmem_cache_alloc_bulk
     0.72%  [kernel]       [k] do_raw_spin_unlock
     0.65%  [kernel]       [k] s_next
     0.65%  [kernel]       [k] mas_wr_walk_index.isra.0
     0.62%  [kernel]       [k] __might_resched
     0.62%  [kernel]       [k] perf_iterate_sb
     0.51%  libc.so.6      [.] __mprotect
     0.50%  [kernel]       [k] perf_event_mmap
     0.46%  [kernel]       [k] kmem_cache_free_bulk.part.0

perf 统计进程信息

用于分析指定程序的性能概况,输入格式:

perf stat [-e | --event=EVENT] [-a]

perf stat [-e | --event=EVENT] [-a] - []

命令:

root@buildroot:~# perf stat ls

功能:

输出包括 ls 的执行时间,以及 10 个性能事件的统计。

打印输出:

root@buildroot:/userdata# perf stat ls
all_in_one.signature  all_in_one.zip  gmsl  log  lost+found  perf.data  perf.txt  perf.unfold  startup.sh  tee

 Performance counter stats for 'ls':

              6.04 msec task-clock                       #    0.742 CPUs utilized
                 0      context-switches                 #    0.000 /sec
                 0      cpu-migrations                   #    0.000 /sec
               125      page-faults                      #   20.680 K/sec
           3605684      cycles                           #    0.597 GHz
           2112783      instructions                     #    0.59  insn per cycle
            250653      branches                         #   41.468 M/sec
             23909      branch-misses                    #    9.54% of all branches

       0.008141958 seconds time elapsed

       0.008350000 seconds user
       0.000000000 seconds sys

字段解析:

  • task-clock:

    • 任务真正占用的处理器时间,单位为 ms。

  • context-switches:

    • 上下文的切换次数。

  • cpu-migrations:

    • 处理器迁移次数。 Linux 为了维持多个处理器的负载均衡,在特定条件下会将某个任务从一个 CPU 迁移到另一个 CPU。

  • page-faults:

    • 缺页异常的次数。当应用程序请求的页面尚未建立、请求的页面不在内存中,或者请求的页面虽然在内存中,但物理地址和虚拟地址的映射关系尚未建立时,都会触发一次缺页异常。

  • cycles:

    • 消耗的处理器周期数。

  • instructions:

    • 执行了多少条指令。

  • branches:

    • 遇到的分支指令数。

  • branch-misses:

    • 预测错误的分支指令数。

perf stat 常用参数

  • p: stat events on existing process id (comma separated list).

    • 作用:仅分析目标进程及其创建的线程。

  • a: system-wide collection from all CPUs.

    • 作用:从所有 CPU 上收集性能数据。

  • r: repeat command and print average + stddev (max: 100).

    • 作用:重复执行命令求平均。

  • C: Count only on the list of CPUs provided (comma separated list).

    • 作用:从指定 CPU 上收集性能数据。

  • v: be more verbose (show counter open errors, etc).

    • 作用:显示更多性能数据。

  • n: null run - don’t start any counters

    • 作用:只显示任务的执行时间。

  • -x SEP:指定输出列的分隔符。

  • -o file:指定输出文件。

命令:

root@buildroot:~# perf stat -r 10 ls > /dev/null

功能:

执行 10 次程序,给出标准偏差与期望的比值。

打印输出:

 Performance counter stats for 'ls' (10 runs):

              3.21 msec task-clock                       #    0.696 CPUs utilized            ( +-  7.72% )
                 0      context-switches                 #    0.000 /sec
                 0      cpu-migrations                   #    0.000 /sec
               121      page-faults                      #   35.452 K/sec                    ( +-  0.22% )
           3842788      cycles                           #    1.126 GHz                      ( +-  1.15% )
           2038097      instructions                     #    0.54  insn per cycle           ( +-  0.35% )
            239562      branches                         #   70.189 M/sec                    ( +-  0.29% )
             22215      branch-misses                    #    9.44% of all branches          ( +-  0.41% )

          0.004613 +- 0.000344 seconds time elapsed  ( +-  7.46% )

字段解析:

在性能测试工具 perf stat 的输出中,括号中的 ​±x% 表示该指标的 ​标准差( Standard Deviation)相对于平均值( Mean)的百分比,通常称为 ​变异系数( Coefficient of Variation, CV)​。它反映了多次运行中该指标的波动范围,用于衡量数据的​稳定性和可靠性。

命令:

root@buildroot:~# perf stat -v ls > /dev/null

功能:

显示更详细的信息。

打印输出:

Using CPUID 0x00000000410fd050
Control descriptor is not initialized
task-clock: 5669250 5669250 5669250
context-switches: 0 5669250 5669250
cpu-migrations: 0 5669250 5669250
page-faults: 120 5669250 5669250
cycles: 3390596 5666583 5666583
instructions: 2003447 5666583 5666583
branches: 237261 5666583 5666583
branch-misses: 22209 5666583 5666583

 Performance counter stats for 'ls':

              5.67 msec task-clock                       #    0.732 CPUs utilized
                 0      context-switches                 #    0.000 /sec
                 0      cpu-migrations                   #    0.000 /sec
               120      page-faults                      #   21.167 K/sec
           3390596      cycles                           #    0.598 GHz
           2003447      instructions                     #    0.59  insn per cycle
            237261      branches                         #   41.851 M/sec
             22209      branch-misses                    #    9.36% of all branches

       0.007745041 seconds time elapsed

       0.007955000 seconds user
       0.000000000 seconds sys

命令:

root@buildroot:~# perf stat -n ls > /dev/null

功能:

只显示任务执行时间,不显示性能计数器。

打印输出:

 Performance counter stats for 'ls':

       0.003568084 seconds time elapsed

       0.003818000 seconds user
       0.000000000 seconds sys

命令:

root@buildroot:~# perf stat -a -A ls > /dev/null

功能:

单独给出每个 CPU 上的信息 。

打印输出:

root@buildroot:~# perf stat -a -A ls > /dev/null

 Performance counter stats for 'system wide':

CPU0                     4.24 msec cpu-clock                        #    1.042 CPUs utilized
CPU1                     4.21 msec cpu-clock                        #    1.034 CPUs utilized
CPU2                     4.19 msec cpu-clock                        #    1.029 CPUs utilized
CPU3                     4.16 msec cpu-clock                        #    1.024 CPUs utilized
CPU4                     4.15 msec cpu-clock                        #    1.020 CPUs utilized
CPU5                     4.14 msec cpu-clock                        #    1.017 CPUs utilized
CPU6                     4.13 msec cpu-clock                        #    1.016 CPUs utilized
CPU7                     4.11 msec cpu-clock                        #    1.010 CPUs utilized
CPU0                        3      context-switches                 #  708.159 /sec
CPU1                        3      context-switches                 #  713.225 /sec
CPU2                        3      context-switches                 #  716.625 /sec
CPU3                        3      context-switches                 #  720.295 /sec
CPU4                        3      context-switches                 #  723.117 /sec
CPU5                        5      context-switches                 #    1.208 K/sec
CPU6                        3      context-switches                 #  726.194 /sec
CPU7                        5      context-switches                 #    1.217 K/sec
CPU0                        1      cpu-migrations                   #  236.053 /sec
CPU1                        1      cpu-migrations                   #  237.742 /sec
CPU2                        1      cpu-migrations                   #  238.875 /sec
CPU3                        1      cpu-migrations                   #  240.098 /sec
CPU4                        1      cpu-migrations                   #  241.039 /sec
CPU5                        1      cpu-migrations                   #  241.687 /sec
CPU6                        1      cpu-migrations                   #  242.065 /sec
CPU7                        1      cpu-migrations                   #  243.408 /sec

perf record 收集信息

收集采样信息,并将其记录在数据文件中。随后可以通过其它工具 (perf-report) 对数据文件进行分析。

常用参数:

perf record 可用的命令选项太多,这里列出常用的选项,完整选项可执行 perf record -h 查看。

  • -a:分析整个系统的性能

  • -A:以 append 的方式写输出文件

  • -c:事件的采样周期

  • -C:只采集指定 CPU 数据

  • -e:选择性能事件,可以是硬件事件也可以是软件事件

  • -f:以 OverWrite 的方式写输出文件

  • -g:记录函数间的调用关系

  • -o:指定输出文件,默认为 perf.data

  • -p:指定一个进程的 ID 来采集特定进程的数据

  • -t:指定一个线程的 ID 来采集特定线程的数据

命令:

root@buildroot:~# perf record -a -F 1000 sleep 5

功能:

用 1000 统计频率,统计一个 sleep 5 秒过程中,全部 CPU 上的事件。


命令:

root@buildroot:~# perf record -p xxx -g

功能:

监控 PID=xxx 的进程,记录调用链并保存输出到默认文件 perf.data 中。


root@buildroot:~# perf record -p xxx -g -o pidxxx.data

功能:

监控 PID=xxx 的进程,记录调用链并保存输出到 pidxxx.data 中。

perf report 分析结果

perf reportperf record 生成的数据文件进行分析。

常用参数:

perf report 可用的命令选项太多,这里列出常用的选项,完整选项可执行 perf report -h 查看。

  • -c:指定采样周期

  • -C:只显示指定 CPU 的信息

  • -d:只显示指定 dos 的符号

  • -g:生成函数调用关系图,具体等同于 perf top 命令中的 -g

  • -i:导入的数据文件的名称,默认为 perf.data

  • -M:以指定汇编指令风格显示

  • –sort:分类统计信息,如 PID、 COMM、 CPU 等

  • -S:只考虑指定符号

  • -U:只显示已解析的符号

  • -v:显示每个符号的地址

命令:

root@buildroot:~# perf report -i perf.data

功能:

对 perf record 生成的数据文件进行分析。

打印输出:

# To display the perf.data header info, please use --header/--header-only options.
#
#
# Total Lost Samples: 0
#
# Samples: 505  of event 'cycles'
# Event count (approx.): 16387804
#
# Children      Self  Command          Shared Object      Symbol
# ........  ........  ...............  .................  ........................................
  [[31m  72.50%[[m     0.00%  swapper          [kernel.kallsyms]  [k] cpu_startup_entry
            |
            ---cpu_startup_entry
               |
                --[[31m71.81%[[m--do_idle
                          |
                          |--[[31m46.64%[[m--default_idle_call
                          |          |
                          |           --[[31m46.21%[[m--arch_cpu_idle
                          |                     |
                          |                      --[[31m14.86%[[m--el1h_64_irq
                          |                                el1h_64_irq_handler
                          |                                el1_interrupt
                          |                                irq_exit_rcu
                          |                                __irq_exit_rcu
                          |                                do_softirq_own_stack
                          |                                call_on_irq_stack
                          |                                ____do_softirq
                          |                                __softirqentry_text_start
                          |                                |
                          |                                |--[[31m6.68%[[m--run_timer_softirq
                          |                                |          |
                          |                                |           --[[31m6.34%[[m--__run_timers.part.0
                          |                                |                     |
                          |                                |                     |--[[32m3.45%[[m--call_timer_fn.constprop.0
                          |                                |                     |          |
                          |                                |                     |          |--[[32m1.72%[[m--process_timeout
                          |                                |                     |          |          wake_up_process
                          |                                |                     |          |          try_to_wake_up
                          |                                |                     |          |          _raw_spin_unlock_irqrestore
                          |                                |                     |          |
                          |                                |                     |           --[[32m0.86%[[m--tcp_orphan_update
                          |                                |                     |
                          |                                |                      --[[32m2.89%[[m--_raw_spin_unlock_irq
                          |                                |
                          |                                |--[[32m4.39%[[m--run_rebalance_domains
                          |                                |          |
                          |                                |          |--[[32m2.50%[[m--rebalance_domains
                          |                                |          |          |
                          |                                |          |           --[[32m2.10%[[m--load_balance
                          |                                |          |                     |
                          |                                |          |                      --[[32m0.75%[[m--find_busiest_group
                          |                                |          |
                          |                                |           --[[32m1.89%[[m--update_blocked_averages
                          |                                |
                          |                                 --[[32m1.59%[[m--rcu_core_si
                          |                                           |
                          |                                           |--[[32m0.90%[[m--file_free_rcu
                          |                                           |
                          |                                            --[[32m0.57%[[m--rcu_core
                          |
                          |--[[31m10.88%[[m--schedule_idle
                          |          __schedule
                          |          finish_task_switch.isra.0
                          |
                          |--[[31m8.46%[[m--nohz_run_idle_balance
                          |          |
                          |          |--[[31m7.71%[[m--_nohz_idle_balance.isra.0
                          |          |          |
                          |          |           --[[32m3.49%[[m--update_blocked_averages
                          |          |
                          |           --[[32m0.52%[[m--_find_next_bit
                          |
                           --[[32m4.75%[[m--tick_nohz_idle_exit

perf 生成火焰图

步骤一

在 xbuild 编译系统中提供了以下命令帮助用户进行 Kernel 的选项配置,该命令会自动使用板级配置文件中设置的 Kernel 配置文件,在配置完成后,自动完成 savedefconfig 和保存工作,输入命令如下 :

./bd.sh boot menuconfig

需要将 BPF_SYSCALL 进行勾选,保存并重新编译内核进行烧录

iperf

步骤二

使用 perf script 工具对 perf.data 进行解析

perf script -i perf.data &> perf.unfold

步骤三

火焰图工具下载 git 命令如下:

git clone https://github.com/brendangregg/FlameGraph.git

下载解压后文件目录如下:

├── README.md
├── aix-perf.pl
├── demos
│   ├── README
│   ├── brkbytes-mysql.svg
│   ├── cpu-grep.svg
│   ├── cpu-illumos-ipdce.svg
│   ├── cpu-illumos-syscalls.svg
│   ├── cpu-illumos-tcpfuse.svg
│   ├── cpu-iozone.svg
│   ├── cpu-ipnet-diff.svg
│   ├── cpu-linux-tar.svg
│   ├── cpu-linux-tcpsend.svg
│   ├── cpu-mixedmode-flamegraph-java.svg
│   ├── cpu-mysql-filt.svg
│   ├── cpu-mysql.svg
│   ├── cpu-qemu-both.svg
│   ├── cpu-zoomable.html
│   ├── hotcold-kernelthread.svg
│   ├── io-gzip.svg
│   ├── io-mysql.svg
│   ├── mallocbytes-bash.svg
│   ├── off-bash.svg
│   ├── off-mysql-busy.svg
│   ├── off-mysql-idle.svg
│   ├── palette-example-broken.svg
│   └── palette-example-working.svg
├── dev
│   ├── README
│   ├── gatherhc-kern.d
│   ├── gatherthc-kern.d
│   ├── hcstackcollapse.pl
│   ├── hotcoldgraph.pl
│   └── thcstackcollapse.pl
├── difffolded.pl
├── docs
│   └── cddl1.txt
├── example-dtrace-stacks.txt
├── example-dtrace.svg
├── example-perf-stacks.txt.gz
├── example-perf.svg
├── files.pl
├── flamegraph.pl
├── jmaps
├── perf.folded
├── perf.svg
├── perf.unfold
├── pkgsplit-perf.pl
├── range-perf.pl
├── record-test.sh
├── stackcollapse-aix.pl
├── stackcollapse-bpftrace.pl
├── stackcollapse-chrome-tracing.py
├── stackcollapse-elfutils.pl
├── stackcollapse-faulthandler.pl
├── stackcollapse-gdb.pl
├── stackcollapse-go.pl
├── stackcollapse-ibmjava.pl
├── stackcollapse-instruments.pl
├── stackcollapse-java-exceptions.pl
├── stackcollapse-jstack.pl
├── stackcollapse-ljp.awk
├── stackcollapse-perf-sched.awk
├── stackcollapse-perf.pl
├── stackcollapse-pmc.pl
├── stackcollapse-recursive.pl
├── stackcollapse-sample.awk
├── stackcollapse-stap.pl
├── stackcollapse-vsprof.pl
├── stackcollapse-vtune-mc.pl
├── stackcollapse-vtune.pl
├── stackcollapse-wcp.pl
├── stackcollapse-xdebug.php
├── stackcollapse.pl
├── test   ├── perf-cycles-instructions-01.txt
│   ├── perf-dd-stacks-01.txt
│   ├── perf-funcab-cmd-01.txt
│   ├── perf-funcab-pid-01.txt
│   ├── perf-iperf-stacks-pidtid-01.txt
│   ├── perf-java-faults-01.txt
│   ├── perf-java-stacks-01.txt
│   ├── perf-java-stacks-02.txt
│   ├── perf-js-stacks-01.txt
│   ├── perf-mirageos-stacks-01.txt
│   ├── perf-numa-stacks-01.txt
│   ├── perf-rust-Yamakaky-dcpu.txt
│   ├── perf-vertx-stacks-01.txt
│   └── results
│       ├── perf-cycles-instructions-01-collapsed-addrs.txt
│       ├── perf-cycles-instructions-01-collapsed-all.txt
│       ├── perf-cycles-instructions-01-collapsed-jit.txt
│       ├── perf-cycles-instructions-01-collapsed-kernel.txt
│       ├── perf-cycles-instructions-01-collapsed-pid.txt
│       ├── perf-cycles-instructions-01-collapsed-tid.txt
│       ├── perf-dd-stacks-01-collapsed-addrs.txt
│       ├── perf-dd-stacks-01-collapsed-all.txt
│       ├── perf-dd-stacks-01-collapsed-jit.txt
│       ├── perf-dd-stacks-01-collapsed-kernel.txt
│       ├── perf-dd-stacks-01-collapsed-pid.txt
│       ├── perf-dd-stacks-01-collapsed-tid.txt
│       ├── perf-funcab-cmd-01-collapsed-addrs.txt
│       ├── perf-funcab-cmd-01-collapsed-all.txt
│       ├── perf-funcab-cmd-01-collapsed-jit.txt
│       ├── perf-funcab-cmd-01-collapsed-kernel.txt
│       ├── perf-funcab-cmd-01-collapsed-pid.txt
│       ├── perf-funcab-cmd-01-collapsed-tid.txt
│       ├── perf-funcab-pid-01-collapsed-addrs.txt
│       ├── perf-funcab-pid-01-collapsed-all.txt
│       ├── perf-funcab-pid-01-collapsed-jit.txt
│       ├── perf-funcab-pid-01-collapsed-kernel.txt
│       ├── perf-funcab-pid-01-collapsed-pid.txt
│       ├── perf-funcab-pid-01-collapsed-tid.txt
│       ├── perf-iperf-stacks-pidtid-01-collapsed-addrs.txt
│       ├── perf-iperf-stacks-pidtid-01-collapsed-all.txt
│       ├── perf-iperf-stacks-pidtid-01-collapsed-jit.txt
│       ├── perf-iperf-stacks-pidtid-01-collapsed-kernel.txt
│       ├── perf-iperf-stacks-pidtid-01-collapsed-pid.txt
│       ├── perf-iperf-stacks-pidtid-01-collapsed-tid.txt
│       ├── perf-java-faults-01-collapsed-addrs.txt
│       ├── perf-java-faults-01-collapsed-all.txt
│       ├── perf-java-faults-01-collapsed-jit.txt
│       ├── perf-java-faults-01-collapsed-kernel.txt
│       ├── perf-java-faults-01-collapsed-pid.txt
│       ├── perf-java-faults-01-collapsed-tid.txt
│       ├── perf-java-stacks-01-collapsed-addrs.txt
│       ├── perf-java-stacks-01-collapsed-all.txt
│       ├── perf-java-stacks-01-collapsed-jit.txt
│       ├── perf-java-stacks-01-collapsed-kernel.txt
│       ├── perf-java-stacks-01-collapsed-pid.txt
│       ├── perf-java-stacks-01-collapsed-tid.txt
│       ├── perf-java-stacks-02-collapsed-addrs.txt
│       ├── perf-java-stacks-02-collapsed-all.txt
│       ├── perf-java-stacks-02-collapsed-jit.txt
│       ├── perf-java-stacks-02-collapsed-kernel.txt
│       ├── perf-java-stacks-02-collapsed-pid.txt
│       ├── perf-java-stacks-02-collapsed-tid.txt
│       ├── perf-js-stacks-01-collapsed-addrs.txt
│       ├── perf-js-stacks-01-collapsed-all.txt
│       ├── perf-js-stacks-01-collapsed-jit.txt
│       ├── perf-js-stacks-01-collapsed-kernel.txt
│       ├── perf-js-stacks-01-collapsed-pid.txt
│       ├── perf-js-stacks-01-collapsed-tid.txt
│       ├── perf-mirageos-stacks-01-collapsed-addrs.txt
│       ├── perf-mirageos-stacks-01-collapsed-all.txt
│       ├── perf-mirageos-stacks-01-collapsed-jit.txt
│       ├── perf-mirageos-stacks-01-collapsed-kernel.txt
│       ├── perf-mirageos-stacks-01-collapsed-pid.txt
│       ├── perf-mirageos-stacks-01-collapsed-tid.txt
│       ├── perf-numa-stacks-01-collapsed-addrs.txt
│       ├── perf-numa-stacks-01-collapsed-all.txt
│       ├── perf-numa-stacks-01-collapsed-jit.txt
│       ├── perf-numa-stacks-01-collapsed-kernel.txt
│       ├── perf-numa-stacks-01-collapsed-pid.txt
│       ├── perf-numa-stacks-01-collapsed-tid.txt
│       ├── perf-rust-Yamakaky-dcpu-collapsed-addrs.txt
│       ├── perf-rust-Yamakaky-dcpu-collapsed-all.txt
│       ├── perf-rust-Yamakaky-dcpu-collapsed-jit.txt
│       ├── perf-rust-Yamakaky-dcpu-collapsed-kernel.txt
│       ├── perf-rust-Yamakaky-dcpu-collapsed-pid.txt
│       ├── perf-rust-Yamakaky-dcpu-collapsed-tid.txt
│       ├── perf-vertx-stacks-01-collapsed-addrs.txt
│       ├── perf-vertx-stacks-01-collapsed-all.txt
│       ├── perf-vertx-stacks-01-collapsed-jit.txt
│       ├── perf-vertx-stacks-01-collapsed-kernel.txt
│       ├── perf-vertx-stacks-01-collapsed-pid.txt
│       └── perf-vertx-stacks-01-collapsed-tid.txt
└── test.sh

可将需要解析的 perf.unfold 文件放入解压后的 FlameGraph 目录中,使用 stackcollapse-perf.pl 工具将 perf.unfold 中的符号进行折叠。

./stackcollapse-perf.pl perf.unfold &> perf.folded

步骤四

使用 flamegraph.pl 工具生成 svg 图。

./flamegraph.pl perf.folded > perf.svg

可以通过 chrome 或者看图软件打开,打开后的火焰图如下:

iperf

火焰图解析

火焰图核心结构
  ‌横轴( X 轴)
    - 表示 ‌CPU 时间分布‌,‌宽度越大的区块‌代表该函数或代码路径消耗的 CPU 时间比例越高,可能是性能瓶颈点‌。
    - 同一层级的所有调用栈并行排列,不表示时间顺序‌。
  ‌纵轴( Y 轴)
    - 表示 ‌调用栈深度‌,‌从下到上‌展示函数调用关系‌。
    - 底层是程序入口(如 main 函数),上层是当前正在执行的函数‌。
  颜色与区块
    - 颜色通常仅用于区分不同函数,无固定含义‌。
    - 高且宽的“平顶”火焰‌(同一函数多次出现在调用栈顶部)是性能优化的关键目标‌。

火焰图分析步骤
  定位 CPU 热点
    - 打开 SVG 火焰图,‌横向观察最宽的区块‌,快速识别消耗 CPU 时间最多的函数‌。
  ‌分析调用链
    - 从底层到顶层‌逐层查看调用关系,确定热点函数的调用路径‌。
  结合 iperf 工作模式
    - 服务端火焰图‌:关注 accept、 recv 等接收逻辑的 CPU 开销‌。
    - 客户端火焰图‌:聚焦 connect、 send 等发送逻辑的性能损耗‌。