参考文章:
http://blog.itpub.net/24585765/viewspace-2564885/
https://www.cnblogs.com/fattyCoder/p/10167740.html

Perf (Performance Event)是 Linux 系统原生提供的性能分析工具, 会返回 CPU 正在执行的函数名以及调用栈

常用命令:
perf record 记录信息到perf.data

perf report 生成报告;

perf diff 对两个记录进行diff;

perf evlist 列出记录的性能事件;

perf annotate 显示perf.data函数代码;

perf archive 将相关符号打包,方便在其它机器进行分析;

perf scriptperf.data输出可读性文本;



### 以perf record开始:

perf record -F 99 -a  -g   -p 1234 -- sleep 30

执行完成后生成perf.data文件
参数解释
perf record: 收集采样信息,并将其记录在数据文件中。随后可通过其它工具对数据文件进行分析。
-F 99 :表示采样频率99HZ
-a: 表示对所有CPU采样,如果只需针对特定的CPU,可以使用-C
-g:表示记录调用栈
-p 1234 :表示要来分析的程序进程号为1234
sleep 30:表示分析持续30秒


生成火焰图:

获取 FlameGraph组件

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

根据perf.data画图

perf script > out.perf
./stackcollapse-perf.pl out.perf > out.folded
./flamegraph.pl out.folded > perf_your_name.svg

附录:

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

注:

sudo  perf record -F 99 -a  -g  -p 118521 -- sleep 30
Warning:
PID/TID switch overriding SYSTEMPermission error mapping pages.
Consider increasing /proc/sys/kernel/perf_event_mlock_kb,
or try again with a smaller value of -m/--mmap_pages.
(current value: -1)
sleep: Terminated

增加参数: -m 2后解决

sudo  perf record -F 99 -a  -g  -m 2 -p 118521 -- sleep 30