perf与火焰图

perf

perflinux下一个非常强大的性能分析工具,通过它可以分析出进程运行过程中的主要时间都花在了哪些地方。它是Linux系统原生提供的性能分析工具,会返回CPU正在执行的函数名以及调用栈(stack。通常,它的执行频率是99Hz(每秒99,如果99次都返回同一个函数名,那就说明CPU这一秒钟都在执行同一个函数,可能存在性能问题。

$ sudo perf record -F 99 -p 13204 -g -- sleep 30

上面的代码中,perf record表示记录,-F 99表示每秒99次,-p 13204是进程号,即对哪个进程进行分析,-g表示记录调用栈,sleep 30则是持续30秒。运行后会产生一个庞大的文本文件。如果一台服务器有16CPU,每秒抽样99次,持续30秒,就得到47,520个调用栈,长达几十万甚至上百万行。

结合著名的 FlameGraph 火焰图工具,我们能够快速定位时间占用较多的函数调用。

# 执行采样
$ perf record -e cpu-clock -g -p ${PID}

# 用 perf script 工具对 perf.data 进行解析
perf script -i perf.data &> perf.unfold

# 将 perf.unfold 中的符号进行折叠
./stackcollapse-perf.pl perf.unfold &> perf.folded

# 生成 svg 火焰图
/flamegraph.pl perf.folded > perf.svg