性能分析工具 -- 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,这是一个图形文件,用浏览器打开后会得到这样一幅图:

image-20210107150732519

此图记录着函数调用关系及其cpu-cycles(时间)占比,就像一缕缕升起的火苗,所以被称之为火焰图。

火焰图还可以通过鼠标点击放大,观察其细节,如下:

image-20210107151154885

results matching ""

    No results matching ""