火焰图性能分析 perf — Jevic

火焰图性能分析 perf

2019/03/03 OPS

从 perf 命令(performance 的缩写)讲起,它是 Linux 系统原生提供的性能分析工具,会返回 CPU 正在执行的函数名以及调用栈(stack)。

通常,它的执行频率是 99Hz(每秒99次),如果99次都返回同一个函数名,那就说明 CPU 这一秒钟都在执行同一个函数,可能存在性能问题。

通过它,应用程序可以利用 PMU,tracepoint 和内核中的特殊计数器来进行性能统计。 不但可以分析指定应用程序的性能问题,也可以用来分析内核的性能问题,当然也可以同时分析应用代码和内核,从而全面理解应用程序中的性能瓶颈

perf

yum install -y perf 
  • perf top

用于实时显示当前系统的性能统计信息。该命令主要用来观察整个系统当前的状态,比如可以通过查看该命令的输出来查看当前系统最耗时的内核函数或某个用户进程

  • perf record
perf record -a -e cycles -o cycle.perf -g sleep 10

-a 对所有 CPU 采样 -o 输出文件名,如果不指定,默认生成 perf.data -g 额外记录函数调用关系 sleep 10 采样 10s

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

perf record表示记录 -F 99表示每秒99次 -p 13204是进程号,即对哪个进程进行分析 -g 表示记录调用栈 sleep 30 如上所述则是持续30秒。

perf record命令可以统计每个调用栈出现的百分比,然后从高到低排列。

perf report -n --stdio
  • perf report
perf report -i <file>

-i 指定 perf record 生成的 perf data 文件,如果不指定 -i 则默认分析 perf.data 文件。 –max-stack=0 只输出第一层函数调用 –stdio 输出到标准输出

生成火焰图

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

1、第一步

perf record -e cpu-clock -g -p 28591

Ctrl+c结束执行后,在当前目录下会生成采样数据perf.data.

2、第二步 用perf script工具对perf.data进行解析

perf script -i perf.data &> perf.unfold

3、第三步

将perf.unfold中的符号进行折叠:

./stackcollapse-perf.pl perf.unfold &> perf.folded

4、最后生成svg图:

./flamegraph.pl perf.folded > perf.svg

使用管道将上面的流程简化为一条命令

perf script -i perf.data| ./stackcollapse-perf.pl | ./flamegraph.pl > process.svg

image

java 应用火焰图生成

获取程序

wget https://github.com/jvm-profiling-tools/async-profiler/releases/download/v1.5/async-profiler-1.5-linux-x64.tar.gz
./profiler.sh -d 30 -f /tmp/elasticsearch.svg 48211
  • 详细使用查看官方介绍即可
  • 下图是我获取elasticsearch 进程的性能图例 image

参考链接

Search

    Post Directory