Linux笔记-性能调优工具perf
参考文章:
http://blog.itpub.net/24585765/viewspace-2564885/
https://www.cnblogs.com/fattyCoder/p/10167740.html
on-cpu/off-cpu/动态加探针 https://pingcap.com/zh/blog/flame-graph
FlameGraphs使用: https://www.brendangregg.com/FlameGraphs/memoryflamegraphs.html
Perf (Performance Event)是 Linux 系统原生提供的性能分析工具, 会返回 CPU 正在执行的函数名以及调用栈
常用命令:
perf record
记录信息到perf.data;
perf report
生成报告;
perf diff
对两个记录进行diff;
perf evlist
列出记录的性能事件;
perf annotate
显示perf.data函数代码;
perf archive
将相关符号打包,方便在其它机器进行分析;
perf script
将perf.data输出可读性文本;
1. 以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
2.perf top: 查看实时信息,类似于linux的top命令,对系统性能进行实时分析。
-g:可以查看堆栈调用
-a:查看所有CPU
perf top -g -p 1234
输出如下:
按?键,输出如下:
Chlidren
和 Self
的含义
https://nanxiao.me/perf-note-4-profile-application/
如以下代码,
Self表示函数本身的overhead:如果foo函数的overhead占60%,那么bar的Self overhead就是40%(刨除foo所占部分)。因为foo和bar都是main的子函数,所以二者的overhead都要计算入main的Children overhead。
void foo(void) {
/* do something */
}
void bar(void) {
/* do something */
foo();
}
int main(void) {
bar()
return 0;
}
附录:
序号 | 命令 | 作用 |
---|---|---|
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