场景
一般情况下,我们会对现有系统进行压测等方式,来了解系统最大的吞吐量等等,通过这种方式得知系统在生产环境下可扛住的压力,如果我们想了解在压测的链路过程中,是哪些地方执行时间过长,影响了系统的吞吐量,可以使用火焰图的方式来观察。
工具
生成火焰图需要两个工具:
1. async-profiler:https://github.com/jvm-profiling-tools/async-profiler
2. FlameGraph:https://github.com/BrendanGregg/FlameGraph
前者用于执行过程中收集耗时数据,后者则是将这些数据渲染成火焰图方便我们查看。
二者都可以在github的Releases地方进行下载。
使用
使用的过程分为两步,一是监控JVM进程,二是监控完毕,生成火焰图。
1. 监控JVM进程
1. 使用jps获取进程的ID
2. 使用 async-profiler 监控
使用下载下来的软件包中的 profiler.sh 脚本执行下面命令:
./profiler.sh -d 60 -o collapsed -f /tmp/test_01.txt ${pid}
-d表示的是持续收集时长,后面60代表持续采集时间60s
-o表示的是采集规范,这里用的是collapsed
-f后面的路径,表示的是数据采集后生成的数据存放的文件路径(这里放在了/tmp/test_01.txt)
${pid}表示的是采集目标进程的pid,就是jps中的进程ID
2. 生成火焰图
使用 FlameGraph 中的 flamegraph.pl 脚本工具 将 /tmp/test_01.txt 变成 svg 图。
./flamegraph.pl /tmp/test_01.txt > /tmp/test_01.svg
这一步生成后,将svg文件拖到浏览器里查看就可以了。