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 report 对 perf 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 进行勾选,保存并重新编译内核进行烧录

步骤二
使用 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 或者看图软件打开,打开后的火焰图如下:

火焰图解析
火焰图核心结构
横轴( X 轴)
- 表示 CPU 时间分布,宽度越大的区块代表该函数或代码路径消耗的 CPU 时间比例越高,可能是性能瓶颈点。
- 同一层级的所有调用栈并行排列,不表示时间顺序。
纵轴( Y 轴)
- 表示 调用栈深度,从下到上展示函数调用关系。
- 底层是程序入口(如 main 函数),上层是当前正在执行的函数。
颜色与区块
- 颜色通常仅用于区分不同函数,无固定含义。
- 高且宽的“平顶”火焰(同一函数多次出现在调用栈顶部)是性能优化的关键目标。
火焰图分析步骤
定位 CPU 热点
- 打开 SVG 火焰图,横向观察最宽的区块,快速识别消耗 CPU 时间最多的函数。
分析调用链
- 从底层到顶层逐层查看调用关系,确定热点函数的调用路径。
结合 iperf 工作模式
- 服务端火焰图:关注 accept、 recv 等接收逻辑的 CPU 开销。
- 客户端火焰图:聚焦 connect、 send 等发送逻辑的性能损耗。