FlameScope 模式识别

Flamescope 是一种新的开源性能可视化工具,它使用亚秒级偏移热图火焰图来分析周期性 活动、方差扰动 。我们在 Netflix 技术博客Netflix FlameScope上发布了这个,该工具位于github 上。虽然火焰图很好理解,但亚秒级偏移热图却不是(它们是我不久前发明的另一种可视化)。FlameScope 应该有助于采用。

总而言之:x 轴是整秒的列,y 轴是每秒内的分数,分组为桶(框)。方框颜色缩放以显示在该秒和亚秒内发生的事件数量:越暗越多。这是 CPU 样本的真实亚秒级偏移热图:

你能从中看出什么?在这篇文章中,我将为 CPU 样本绘制一些合成的亚秒级偏移热图,以便我可以分离出来并向您展示模式。在真正的火焰范围工具中,可以选择这些模式并生成火焰图,以显示负责的代码路径(我这里不演示火焰图)。

定期活动

1.一个线程,每秒一次


一个线程每秒以相同的偏移量唤醒,完成几毫秒的工作,然后重新进入睡眠状态。

2.一个线程,每秒两次


唤醒时间正好相隔 500 毫秒。它可能是两个线程,但考虑到 500 毫秒的偏移量,它很可能是一个。

3.两个线程


这看起来像两个线程每秒唤醒一次。

4. 一个忙等待线程,每秒一次


该线程执行大约 20 毫秒的工作,然后休眠一整秒(1000 毫秒)。这是一种常见的模式,会导致唤醒偏移量每秒钟都向前爬行。

5. 一个忙等待线程,每秒两次


唤醒现在相隔 500 毫秒。可能是一个线程,每秒两次。

6. 一个繁忙的等待线程


斜率更高,因为它每秒做更多的工作,看起来大约 80 毫秒。

7. 一个不那么忙的等待线程


斜率更小,因为它每秒做的工作更少,可能只有几毫秒。

8. 一个忙等待线程,每五秒一次


现在它每 5 秒只唤醒一次。

如果您已经想知道,我认为我们可以根据角度和唤醒之间的间隔来计算每次唤醒的 CPU 繁忙时间:

busy_time = (1000ms / (heatmap_rows x 间距)) x tan(角度)

所以我之前的 45 度线是:

busy_time = (1000ms / (50 x 1)) x tan(45) = 20ms

方差

9. CPU 100% 利用率


如果你完美地最大化所有 CPU 会是什么样子。

10. CPU 利用率 50%


现实世界的工作负载看起来更像这样。它由短请求、随机到达组成。

11. CPU 使用率 25%


相同的工作量为 25%。

12. CPU 使用率 5%


相同的工作量为 5%。

13.负载增加


在 2 分钟的时间里,负载变得更重了。

14.可变负载


每 30 秒就有 5 秒的更重的工作。

扰动

15. CPU 扰动


每隔一段时间,所有 CPU 的最大输出时间为 100 毫秒。(例如,GC)。

16.CPU阻塞


每隔一段时间,所有 CPU 就会空闲 100 毫秒。(例如,I/O)。

17. 单线程阻塞


每隔一段时间,除了一个(粉红色线,而不是白色线)(例如,全局锁)之外,所有 CPU 都处于空闲状态。

最后一种模式特别有趣:它发生在所有线程都被一个锁阻塞时,该锁由一个在 CPU 上运行的线程持有。那个线程在做什么?只需单击 FlameScope 中的粉红色线,现在您正在查看其火焰图。这使得分析一个困难的性能问题变得微不足道。

结论

现在你能看到什么?:

你现在说火焰范围。在真正的火焰范围工具中,您可以选择其中的每一种模式,并且会显示一个火焰图来解释负责的代码路径。

今晚,我将在关于 FlameScope 的 LinkedIn 性能会议上与我的同事 Martin Spier 发表演讲,他已经完成了 Netflix/FlameScope 工具的大部分开发工作。

祝 FlameScoping 好运,请分享您遇到的有趣模式的屏幕截图!

转载翻译自: https://www.brendangregg.com