flink火焰图使用

官方文档:https://nightlies.apache.org/flink/flink-docs-stable/docs/ops/debugging/flame_graphs/

示例:

怎么看:

从下往上看。一个方块一般表示的是调用栈中的一个栈帧。

1)先看类型

  • On-CPU:谁在耗 CPU
  • Off-CPU:谁在等待/阻塞
  • Mixed:总时间(算+等)

排查性能问题通常:先 Mixed 全局看,再 On/Off 分开确认。


2)读图基本规则

  • 每个方块 = 一个函数栈帧
  • 从下到上 = 调用关系(下是调用者,上是被调用)
  • 宽度 = 时间占比(最重要)
  • 左右位置通常无业务意义(只是排版)

3)先抓"最宽顶部平台"

先找最宽的一段,再一路往下看"它是谁调用来的",往上看"它具体做了什么"。

不要被单个高框迷惑,宽度才是瓶颈权重


判断是业务问题还是框架问题

1️⃣ 如果是你自己的类

例如:

复制代码
com.xxx.OrderProcessFunction

那说明:

✔ 业务逻辑复杂

✔ 可能有死循环

✔ 有同步阻塞

👉 优化方向:算法 or 缓存


例如:

复制代码
org.apache.flink.streaming.runtime.tasks.StreamTask

说明:

✔ checkpoint 压力

✔ 反压

✔ watermark 对齐

✔ 网络堆积


3️⃣ 如果是 RocksDB 宽

例如:

复制代码
org.rocksdb.RocksDB.get

说明:

✔ 状态访问频繁

✔ 状态太大

✔ compaction 频繁

👉 优化:

  • 增大 write buffer

  • 调整 state TTL

  • 减少 key 数

  • 用 Heap State 看效果


4️⃣ 如果是 GC 宽

例如:

复制代码
G1YoungCollection

说明:

✔ 对象创建太频繁

✔ 序列化对象多

✔ JSON 解析频繁

👉 优化:

  • 复用对象

  • 用 Kryo 优化

  • 减少 new


🎯 场景1:CPU 100%

看是不是:

  • map/flatMap 太重

  • JSON 解析

  • 加密解密

  • 正则表达式


🎯 场景2:吞吐上不去

火焰图如果显示:

MailboxProcessor.run

通常是:

  • 反压

  • 下游慢


🎯 场景3:延迟高

如果大量时间在:

StreamTask.invoke

说明:

  • checkpoint 对齐

  • watermark 等待

反压场景下火焰图怎么读?

🔥 情况一:看到大量 park / mailbox

典型栈:

复制代码
LockSupport.park
MailboxProcessor.run
StreamTask.run

说明:

✔ 线程在等 buffer

✔ 网络反压

✔ 下游没处理完

这时火焰图告诉你:

这层不是根因,继续往下游找。


🔥 情况二:某个业务函数特别宽

例如:

复制代码
com.xxx.MyProcessFunction.processElement

那说明:

✔ 真正瓶颈是业务逻辑

✔ CPU算不过来

常见原因:

  • JSON 解析

  • 正则

  • 加解密

  • 远程 RPC

  • 大对象创建

👉 优化代码或加并行度。


🔥 情况三:RocksDB 很宽

例如:

复制代码
org.rocksdb.RocksDB.get
RocksDB.put

说明:

✔ 状态访问太频繁

✔ key 太多

✔ compaction 压力大

解决方向:

  • 减少状态访问次数

  • 合并状态

  • 调大 write buffer

  • 提升并行度


🔥 情况四:Checkpoint 很宽

看到:

复制代码
AsyncCheckpointRunnable
snapshotState
RocksDB.flush

说明:

✔ checkpoint 卡住

✔ 状态太大

✔ IO 慢

这类反压通常是:

周期性抖动


🔥 情况五:Sink 特别宽

例如:

复制代码
KafkaProducer.send
ElasticsearchBulkProcessor
HTTP client

说明:

✔ 外部系统写入慢

✔ 下游存储瓶颈

这类是最常见的真实反压源头。

三种模式:

  1. On-CPU(在 CPU 上)

表示线程真正占用 CPU 执行代码的时间。

  • 看的是"谁在烧 CPU"
  • 适合定位:计算热点、序列化开销、GC CPU 消耗、热点函数优化
  • 宽度越大,说明该调用栈消耗 CPU 越多

2) Off-CPU(不在 CPU 上)

表示线程没有在 CPU 上运行,而是在等待/阻塞。

常见原因:

  • 锁竞争(park, monitor enter

  • I/O 等待(磁盘/网络)

  • 条件变量等待、sleep、epoll wait

  • 下游慢导致阻塞(流处理里常见)

  • 看的是"为什么慢但 CPU 不高"

  • 适合定位:卡顿、延迟高、吞吐低但 CPU 利用率不高的问题


3) Mixed(混合)

把 On-CPU + Off-CPU 合在一起看(接近 wall-clock 总体视角)。

  • 既能看到"在算什么",也能看到"在等什么"
  • 适合先全局排查瓶颈,再切到 on/off 细看

  • CPU 很高 :先看 On-CPU
  • 任务慢但 CPU 不高 :看 Off-CPU
  • 不确定瓶颈在哪 :先看 Mixed 再分解

一句话总结:
On-CPU = 算得慢;Off-CPU = 等得久;Mixed = 算+等的总账。

相关推荐
前沿行业洞察26 分钟前
号码认证的终端覆盖为什么重要?——从手机原生到全渠道展示的生态解析
大数据
JQweryuiop30 分钟前
中小型游戏陪练工作室数字化管理实践:基于七彩屋电竞护航小程序订单、履约与绩效系统的落地复盘
大数据·游戏·小程序·架构
人工智能培训31 分钟前
未来三年,AI 落地的五个确定性判断
大数据·人工智能·学习·生活·ai写作
江屿风2 小时前
【认识深度学习】【深度学习分类与计算机视觉任务要点解析】流食般投喂
大数据·人工智能·深度学习·计算机视觉·目标跟踪·自然语言处理·语音识别
建筑工程企业管理系统2 小时前
工程建设管理信息系统如何选型?多项目协同管控避坑指南
大数据·软件工程·软件需求
灰山君2 小时前
企业三维可视化怎么选?山海鲸可视化与老子云3D优势对比
大数据·经验分享·数字孪生·可视化·数据可视化·实时大数据
Elastic 中国社区官方博客2 小时前
jina-ocr-v1:在低成本 GPU 上实现更快速的文档解析
大数据·数据库·elasticsearch·搜索引擎·全文检索·jina
Databend2 小时前
Jev 爆火之后,我们把它集成进了数据湖仓
大数据·数据库·agent
拾光师2 小时前
MapReduce Shuffle 深度解析:数据从 Map 到 Reduce 的完整旅程
大数据
小小程序猴12 小时前
中小企业AI转型课程模块的工程化设计:从能力矩阵到课程编排
大数据·人工智能