perf性能调优
工具准备
ubuntu:sudo apt-get install perf
嵌入式平台:下载源码编译
注意:编译过程中会有Auto-detectiing system feature的依赖库打印,注意其中off的,代表此库没有符号表;
测试程序增加-fno-omit-fram-pointer -fno-optimize-sibling-calls -mno-omit-leaf-frame-pointer, 避免fp栈帧复用(折叠)导致调用栈不符合预期的问题;
或者使用 --call-graph dwarf ,但耗时会很长:https://fedoraproject.org/wiki/Changes/fno-omit-frame-pointer / https://hal.inria.fr/hal-02297690/document
--call-graph fp 等同于 -g(默认使用fp获取栈帧)
调优
查找系统热点
- sudo perf top:得到热点函数
- 查找热点函数的调用栈
查找进程热点
- 确保进程中每个线程都有自己的名字:否则同个函数名字的统计会被叠加到一起;
- sudo perf record -p pid sleep n : 采集n秒的数据;
- sudo perf report:查看热点函数;
- 若需要知道热点函数的调用栈,在录制数据时加 -g 参数;
进程火焰图
- sudo perf record -g -p pid sleep n
- sudo chown xxx:xxx perf.data
- 用perf script解析perf.data: perf script -i perf.data > perf.unfold
- 用FlameGraph折叠符号:./FlameGraph/stackcollapse-perf.pl perf.unfold > perf.folded
- 生成向量图(svg图): ./FlameGraph/flamegraph.pl perf.folded > perf.svg
- 用Firefox或chome浏览器打开图片即可
查找代码性能缺陷
sudo perf stat
- branch miss
- 缺页
- cache抖动