async-profiler使用

简介

async-profiler 是一款低开销采集分析 java 性能的工具。它利用HotSpot特殊的 api 来收集栈信息以及内存分配信息,可以在OpenJDK,Oracle JDK以及一些其他的基于 HotSpot 的 java 虚拟机。async-profiler 可以追踪以下几种事件:

  • cpu 周期;
  • 硬件和软件性能计数器,例如高速缓存未命中,分支未命中,页面错误,上下文切换等;
  • Java 堆中内存的分配;
  • 锁尝试,包括 Java 对象监视器和 ReentrantLock。

使用

首先,从 github 主页 下载已经编译好的文件,解压即可使用。还可以与IntelliJ IDEA Ultimate 2018.3及更高版本捆绑在一起。

解压后,进入目录,直接运行 ./profiler.sh,会提示怎么使用。

./profiler.sh [action] [options] <pid>

action选项说明:

Actions说明
start开始分析并立即返回
resume启动或恢复已停止的较早的性能分析会话。所有收集的数据仍然有效。
会话之间不保留概要分析选项,应重新指定。
stop停止分析并打印报告
check检查指定的分析事件是否可用
status打印配置文件状态:探查器是否处于活动状态以及持续多长时间
list显示可用概要分析事件的列表。此选项仍然需要PID,因为受支持的事件可能因JVM版本而异
collect收集指定时间段的配置文件,然后停止(默认操作)

options参数说明:

options说明
-e分析事件:cpu,alloc,lock,cache-misses等。使用list查看可用事件的完整列表。
默认为cpu。
-d分析持续时间(以秒为单位)。
如果未提供start,resume,stop或status的action选项,则探查器将在指定的时间段内运行,
然后自动停止。
-f将配置文件信息转储到的文件名。
%p: 文件名中的%p扩展为目标JVM的PID;
%t: 文件名中的%t扩展为命令调用时的时间戳。
例如:./profiler.sh -o collapsed -f /tmp/traces-%t.txt 8983
-i设置分析间隔(以纳秒或其他单位为单位),如果N后跟ms(毫秒),us(微秒)或s(秒)。
仅计算CPU活动时间。 CPU空闲时未收集任何样本。默认值为10000000(10ms)。
-j设置Java堆栈分析深度。如果N大于默认值2048,则将忽略此选项。
-t分别剖析进程下的线程。每个堆栈跟踪都将以表示单个线程的框架结束。
例如:./profiler.sh -t 8983
-s打印简单的类名
-g打印方法签名
-a通过添加_ [j]后缀来注释Java方法名称。
-o输出格式:summary | traces | flat | collapsed | svg | tree | jfr
-I仅输出包含指定模式的堆栈跟踪
-X排除具有指定模式的堆栈跟踪
-v显示版本字符串

使用demo:

# 启动采集。默认情况下,生成的是cpu的火焰图,即event为cpu。可以用--event参数来指定
./profiler start

#停止采集,会显示生成的文件路径
./profiler stop

#默认生成的svg,可以指定生成html格式
./profiler stop --format html

#对 PID 为 3456 的进程采样cpu 30 秒,然后生成 profile.svg 结果文件
./profiler.sh -d 30 -f profile.svg 3456

#对 PID 为 3456 的进程采样内存 30 秒,然后生成 profile.svg 结果文件
./profiler.sh -e alloc -d 30 -f profile.svg 3456

横条越长,代表使用的资源越多,从下到上是调用堆栈信息。

Flink job性能排查

按照以下步骤排查:

  • 将 async-profiler 拷贝到所有节点上;
  • 通过 Flink UI 查看 job 的所在节点;
  • 在对应节点上找到taskManager的进程id,然后执行命令,生成svg;
  • 下载svg,用浏览器查看分析。