跳到主要内容

火焰图使用

什么是火焰图?

火焰图(Flame Graph)是一种可视化性能分析工具,用于展示代码执行时的函数调用栈及其耗时比例。它通过横向的“火焰”状条形图,直观呈现:

  1. 调用栈深度(纵轴)
  2. 函数耗时占比(横轴宽度)
  3. 热点路径(最宽的“火焰”)

在Jaeger中,火焰图可帮助开发者快速定位分布式系统中的性能瓶颈。

为什么叫“火焰图”?

因为图形类似火焰的形态——底部是调用栈的“根部”,向上逐渐分叉变窄,最耗时的部分像火焰的顶部。

基础结构解析

关键特征:

  • 每一层代表一个调用栈层级
  • 宽度表示函数在采样中出现的频率(或耗时)
  • 颜色通常无特定含义(可自定义区分模块)

在Jaeger中生成火焰图

步骤1:获取追踪数据

确保Jaeger已收集到服务的追踪数据。例如通过OpenTelemetry上报:

go
// Go示例:初始化OpenTelemetry导出器
exporter, _ := jaeger.New(jaeger.WithCollectorEndpoint(
jaeger.WithEndpoint("http://jaeger-collector:14268/api/traces"),
))

步骤2:打开火焰图视图

  1. 在Jaeger UI中选择一个追踪
  2. 点击顶部选项卡中的 "Flamegraph"
  3. 等待渲染完成(大数据集可能需要几秒)
注意

火焰图默认按时间消耗排序。如需切换为其他指标(如调用次数),点击右上角的下拉菜单。

实际案例分析

场景:API响应缓慢

假设用户报告/checkout接口偶尔变慢,通过火焰图发现:

诊断结论:

  • 75%时间花费在支付网络I/O
  • 优化建议:检查Stripe连接池或实现异步支付

交互操作指南

操作效果
鼠标悬停显示函数详情和耗时占比
点击缩放展开/折叠调用栈
Ctrl+滚轮水平缩放视图
搜索框过滤高亮匹配函数(支持正则)

代码示例:生成离线火焰图

如果需要导出分析,可使用pyroscope工具转换Jaeger数据:

bash
# 将Jaeger JSON转换为火焰图格式
jaeger2flamegraph trace.json > flamegraph.html

输出文件包含可交互的SVG图形,支持:

  • 动态过滤
  • 点击钻取
  • 导出为PNG

总结与练习

关键要点

  1. 火焰图宽度直接反映性能热点
  2. 从最宽处开始优化往往效率最高
  3. Jaeger集成使分布式追踪分析更直观

练习建议

  1. 在测试环境故意制造一个性能退化(如添加sleep()调用)
  2. 使用火焰图定位注入的问题点
  3. 尝试用搜索功能过滤特定服务的方法调用

扩展阅读