perf是由Linux Kernel提供的动态追踪调试工具,我们可以使用perf对运行时的程序进行分析
相比单纯依赖log,core进行离线排查,perf是一种在线的调试手段,可以在线上随时进行采样并进行分析,无需预先埋点,所带来的只是采样时间段内的一些性能损耗,这种特性使perf很适合于排查未知的问题
perf生成的运行时栈可以通过FlameGraph生成交互式的图表,可以更方便地分析热点
安装perf
sudo apt-get install linux-tools-common linux-tools-generic linux-tools-`uname -r`
使用perf对特定进程进行采样
sudo perf record -p 14573 -g -- sleep 60 // 对pid为14573的进程进行60秒的采样
sudo perf script > out.perf //输出采样数据
使用FlameGraph产生火焰图
git clone https://github.com/brendangregg/FlameGraph //FlameGraph是一系列perl脚本,clone下来即可使用
./stackcollapse-perf.pl out.perf > out.folded //生成折叠后的调用栈
./flamegraph.pl out.folded > out.svg //生成火焰图
最终可以生成如下svg文件 out.svg
分析需要注意的点
火焰图中的颜色没有特殊含义
火焰图的每一层栈都可以展开
火焰图中的色块宽度只代表采样命中率,不代表绝对运行时间
Extra Refrences
https://openresty.org/posts/dynamic-tracing/
http://kernel.taobao.org/index.php?title=Documents/Kernel_Perf
http://dtrace.org/blogs/brendan/