CPP-性能分析工具

工具介绍

perf

1
2
3
4
5
6
7
8
9
10
11
12
13
perf支持命令非常多,常用的有以下几个

perf list
查看可采样的指标

perf stat
查看cpu占用率、进程上下文切换、CPU迁移、缺页中断等指标总体情况

perf record
采样某个指标的具体情况

perf report
根据采样结果生成报告

关于perf原理可查看:https://zhuanlan.zhihu.com/p/22194920

火焰图

perf工具生成的报告不够直观,可以使用https://github.com/brendangregg/FlameGraph 工具将采样结果生成火焰图,方便查看。

strace

采样进程系统系统调用情况。

示例

使用上述工具,采样一个程序的运行情况。

  1. 启动进程
    启动本地实例,通过ps -ef | grep proc查找进程pid。

  2. 使用perf采样数据
    使用

    1
    perf record -e task-clock -g -p pid // 采样进程的cpu使用详情。

    其中-e task-clock表示采样各个任务占用cpu时间,-g表示获取任务间的调用链,-p pid表示采样指定进程。
    可以通过CTRL+C可以结束采样,采样结束后会在本地路径生成一个名为perf.data的采样文件。

  3. 使用perf查看报告
    可以通过

    1
    perf report -i perf.data  //命令生成报告

    其中-i perf.data表示指定数据源,perf.data是perf record的采样结果。
    命令执行结果如下。+表示可以展开调用链,按下回车键即可。从下面结果我们就可以查看函数执行占用的cpu时间比例。
    Perf

  4. 使用火焰图
    perf生成的报告可以查看结果,但是没有火焰图直观,可以通过https://github.com/brendangregg/FlameGraph 工具来生成,具体操作如下,执行下面几个命令生成svg文件。

    1
    2
    3
    4
    5
    6
    7
    perf script -i perf.data > perf.unfold
    ./FlameGraph/stackcollapse-perf.pl perf.unfold > perf.folded
    ./FlameGraph/flamegraph.pl perf.folded > perf.svg

    上述命令可以通过管道简化为:

    perf script -i perf.data | ./FlameGraph/stackcollapse-perf.pl | ./FlameGraph/flamegraph.pl > process.svg

    生成svg文件,可以将其在浏览器打开,查看火焰图,如下所示。
    Perf2

  5. 查看系统调用
    执行

    1
    strace -o output.txt -c -e trace=all -p pid

    命令,将系统调用统计结果记录到output.txt文件中,按下CTRL+C可以结束跟踪,结果如下。
    Perf3