性能分析工具 -- perf
Perf 是内置于 Linux 内核源码树中的性能剖析(profiling)工具,它基于事件采样原理,以性能事件为基础,支持针对处理器相关性能指标与操作系统相关性能指标的性能剖析,常用于性能瓶颈的查找与热点代码的定位。
通过它,应用程序可以利用 PMU,tracepoint 和内核中的特殊计数器来进行性能统计。它不但可以分析指定应用程序的性能问题 (per thread),也可以用来分析内核的性能问题,当然也可以同时分析应用代码和内核,从而全面理解应用程序中的性能瓶颈。
使用 perf,您可以分析程序运行期间发生的硬件事件,比如 instructions retired ,processor clock cycles 等;您也可以分析软件事件,比如 Page Fault 和进程切换。这使得 Perf 拥有了众多的性能分析能力,举例来说,使用 Perf 可以计算每个时钟周期内的指令数,称为 IPC,IPC 偏低表明代码没有很好地利用 CPU。Perf 还可以对程序进行函数级别的采样,从而了解程序的性能瓶颈究竟在哪里等等。Perf 还可以替代 strace,可以添加动态内核 probe 点,还可以做 benchmark 衡量调度器的好坏。
安装perf
# 安装 perf 命令
apt install perf
装完之后就可以使用perf命令了。
usage: perf [--version] [--help] [OPTIONS] COMMAND [ARGS]
The most commonly used perf commands are:
annotate Read perf.data (created by perf record) and display annotatedd code
archive Create archive with object files with build-ids found in perff.data file
bench General framework for benchmark suites
buildid-cache Manage build-id cache.
buildid-list List the buildids in a perf.data file
c2c Shared Data C2C/HITM Analyzer.
config Get and set variables in a configuration file.
data Data file related processing
diff Read perf.data files and display the differential profile
evlist List the event names in a perf.data file
ftrace simple wrapper for kernel's ftrace functionality
inject Filter to augment the events stream with additional informatiion
kallsyms Searches running kernel for symbols
kmem Tool to trace/measure kernel memory properties
kvm Tool to trace/measure kvm guest os
list List all symbolic event types
lock Analyze lock events
mem Profile memory accesses
record Run a command and record its profile into perf.data
report Read perf.data (created by perf record) and display the profiile
sched Tool to trace/measure scheduler properties (latencies)
script Read perf.data (created by perf record) and display trace outtput
stat Run a command and gather performance counter statistics
test Runs sanity tests.
timechart Tool to visualize total system behavior during a workload
top System profiling tool.
version display the version of perf binary
See 'perf help COMMAND' for more information on a specific command.
安装flamegraph
火焰图是脚本,只需要下载:
git clone https://github.com/brendangregg/FlameGraph.git
查看当前软硬件环境、支持的性能事件
查看所有分类事件的个数:
perf list | awk -F: '/Tracepoint event/ { lib[$1]++ } END { for (l in lib) { printf " %-16s %d\n", l, lib[l] } }' | sort | column
在 ICE 芯片运行结果如下:
root@thead-910:~# perf list | awk -F: '/Tracepoint event/ { lib[$1]++ } END { for (l in lib) { printf " %-16s %d\n", l, lib[l] } }' | sort | column
9p 3 iomap 9 random 16
alarmtimer 4 irq 5 ras 4
block 19 jbd2 17 raw_syscalls 2
bpf_test_run 1 kmem 13 rcu 1
bpf_trace 1 kyber 3 regmap 15
cgroup 13 mdio 1 rpcgss 26
clk 16 migrate 1 sched 20
compaction 14 mmap 1 signal 2
cpuhp 3 mmc 2 skb 3
dma_fence 7 module 5 smbus 4
dwc3 15 napi 1 sock 3
ext4 117 neigh 7 spi 7
fib 1 net 18 sunrpc 127
fib6 1 nfs 58 swiotlb 1
filelock 12 nfs4 87 task 2
filemap 4 oom 8 tcp 7
ftrace 1 page_pool 4 timer 12
gadget 24 pagemap 2 udp 1
gpio 2 percpu 5 vmscan 14
i2c 4 power 22 workqueue 4
initcall 3 printk 1 writeback 30
io_uring 14 qdisc 4 xdp 12
flamegraph火焰图
如果希望了解CPU在一段时间内的都运行了哪些函数以及各函数都消耗了多少时间,就可以使用On CPU火焰图,这种火焰图基于cpu-cycles事件进行采样,然后通过svg图片格式展现出来
dd if=/dev/zero of=/tmp/testfile bs=4K count=102400 &
perf record -e cpu-cycles -a -g sleep 1
perf script > perf.unfold
cd FlameGraph
./stackcollapse-perf.pl < ../perf.unfold | ./flamegraph.pl > ../perf.svg
首先在后台启动一个dd命令,让它持续运行一段时间,然后开启perf record,记录一秒钟内cpu都运行了多少个cpu-cycles,也就是时间(同时使能-g,就会一并记录运行的函数以及调用关系),再利用perf script命令将perf.data转成perf.unfold,最后利用FlameGraph工具将其转换成一个perf.svg,这是一个图形文件,用浏览器打开后会得到这样一幅图:
此图记录着函数调用关系及其cpu-cycles(时间)占比,就像一缕缕升起的火苗,所以被称之为火焰图。
火焰图还可以通过鼠标点击放大,观察其细节,如下: