原文:Heatmap

使用分析器(profiler)能够解决的问题可以划分为两大类:

  1. 优化整体资源使用量
  2. 解决间歇性性能问题

火焰图对于第一类问题比较趁手,但对于分析短暂性异常帮助不大,因为火焰图提供的是聚合视图,缺乏任何时间线信息。为分析解决第二类问题,async-profiler 提供了一个转换器 - 从 JFR 格式文件生成单 HTML 页面文件形式的交互式热图。

热图是性能分析数据的另一种表现方式,保留了采样点的时间戳。本质上,它是一个由彩色方块组成的二维时间线。每个方块代表一个较短的时间段(通常在毫秒到秒的范围内),方块颜色是第三维度:颜色越鲜艳,表示该时间段内发生的事件越多。

heatmap

热图的思路借鉴自 FlameScope,然而 FlameScope 的目标是处理短时间(最多几分钟)的性能分析数据,而 async-profiler 的实现能够可视化长达 24 小时的记录,时间粒度可以小到 20 毫秒。并且, async-profiler 生成的热图不依赖于服务器(serverless),是独立的自包含的 HTML 文件,方便分享,仅需浏览器即可查看,无需其他特定软件。

热图的功能特性

全天性能分析

热图优化了信息密度。一整天连续的性能分析数据都可以展现在一个图像上,工程师可以一目了然地发现常规的活动模式和异常情况。

热图还优化了数据的空间占用。专门的压缩算法可以将 1GB 原始 JFR 记录压缩打包成大小仅为 10-15MB 的 HTML 页面。

heatmap1

缩放 / 放大

根据记录的持续时间和你感兴趣的细节程度,你可以切换三种可用的缩放级别。最大缩放级别下,每个垂直线条代表 5 分钟的墙面时钟时间,每个方块对应 5 秒的时间间隔。最精细(finest)缩放级别下,每个方块对应 20 毫秒,让你能够以高分辨率分析性能采样数据。

heatmap2

即时火焰图

点击热图上的任意方块,将显示该特定时间间隔的火焰图。

heatmap3

按住鼠标按钮,在热图上选择任意时间范围,将自动构建显示该时间范围的火焰图。

heatmap4

比较不同时间范围的性能分析数据

按照上述方法选择目标时间范围,然后按住 Ctrl 键,移动鼠标指针选择另一个时间范围作为基线,你将得到一个差异火焰图 - 突出显示在目标时间范围内比基线更频繁出现的调用栈。

heatmap5

搜索匹配

按下 Ctrl+F 并输入一个正则表达式,可以在整个热图中进行搜索匹配。匹配堆栈的时间区间方块将在热图中以蓝色高亮显示。如果有匹配的帧,也会在火焰图中高亮显示。

Ctrl+Shift+F 的作用相同,不过火焰图只会保留包含匹配帧的堆栈。其他堆栈都会被过滤掉。

heatmap6

生成热图

热图只能从 JFR 格式的记录数据生成。带着 -o heatmap 选项运行 jfrconv 即可。

jfrconv 标准选项(--cpu--alloc--from/--to--simple等)均适用于热图生成。

示例:

jfrconv --cpu -o heatmap profiler.jfr heatmap-cpu.html