- 大数据
- 流处理
- 批处理
- 数据工程
【免费下载链接】flink
自 Flink 1.19 起,Flink 通过 Web UI 集成了 async-profiler 为主体,结合仓库中的 REST 配置项、ProfilingService实现与 Web Dashboard 源码,完整讲解该功能的启用方法、五种剖析模式的差异、Web UI 操作流程、结果文件管理以及常见故障排查,帮助你快速定位生产环境中的 CPU、锁竞争、内存分配等性能瓶颈。
功能概览与工作原理
Flink Profiler 是一个**可选(opt-in)**的实验性功能。其核心工作链路位于 ProfilingService.java:
- 用户在 Web UI 上发起剖析请求后,前端通过 REST API 将
duration(时长,秒)与mode(剖析模式)提交给 JobManager 或对应 TaskManager 的 REST Handler; - 后端调用
AsyncProfiler.getInstance().execute("start,event=<mode>")启动剖析; - 剖析时长到期后,
ProfilingFuture中的定时任务(flink-profiling-service单线程调度器)触发stop,file=<输出路径>停止剖析并写出结果文件; - 结果以 HTML 文件形式存储,用户可直接在 Web UI 上点击链接下载查看。
该服务以单例形式运行,同一时刻每个组件只允许存在一个运行中的剖析实例;若在剖析未结束时再次发起请求,requestProfiling会直接返回异常提示(见 ProfilingService.java)。从源码结构看,剖析请求链路覆盖了 REST 消息定义(ProfilingRequestBody)、Handler(JobManagerProfilingHandler 与 TaskManagerProfilingHandler)以及 ResourceManager 到 TaskExecutor 的 RPC 转发,前后端闭环完整。
启用 Profiler:相关配置详解
任何测量过程本身都会不可避免地影响被测量对象。为了防止对生产环境造成意外影响,Profiler 默认是关闭的,需要显式开启。
在 Flink 配置文件(conf/flink-conf.yaml)中设置:
rest.profiling.enabled: true建议在开发与预生产环境启用;若要在生产环境使用,应将其视为实验性功能并谨慎评估影响。
围绕该功能,RestOptions.java 中还定义了以下可调参数,均归属Expert REST配置分区:
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
rest.profiling.enabled | Boolean | false | 启用实验性 Profiler 功能,即本功能的开关 |
rest.profiling.history-size | Integer | 10 | JobManager 或每个 TaskManager 维护的最大剖析历史实例数;超过后按滚动策略移除最旧实例 |
rest.profiling.duration-max | Duration | 300 s | 单次剖析请求允许的最大时长;超过该值的请求将被拒绝 |
rest.profiling.dir | String | java.io.tmpdir(系统临时目录) | 剖析结果文件的存储目录 |
时长上限的强制校验:REST Handler 在收到剖析请求时会先校验duration是否满足0 < duration <= rest.profiling.duration-max,不满足则直接抛出IllegalArgumentException(见 TaskManagerProfilingHandler.java)。Web UI 前端默认提供 30 秒的初始时长,步进 30 秒,最小值 1 秒。
历史与结果文件管理:ProfilingService用ArrayDeque<ProfilingInfo>按组件(resourceID)维护剖析历史,当队列长度超过rest.profiling.history-size时,会通过rollingClearing删除最旧的输出文件以回收磁盘空间(见 ProfilingService.java)。输出文件命名格式为<resourceID>_<mode>_<yyyy-MM-dd_HH_mm_ss>.html(见 ProfilingService.java),因此可依据文件名直观判断剖析对象、模式与时间。
支持的剖析模式
Profiler 支持五种事件模式,对应 ProfilingInfo.java 中的枚举CPU / ALLOC / LOCK / WALL / ITIMER(内部通过name().toLowerCase()转为 async-profiler 的event参数)。各模式语义如下:
CPU
收集包含 Java 方法、native 调用、JVM 代码和内核函数的调用栈采样。适用于定位 CPU 密集热点。
Allocation
分配剖析模式下,每条调用栈的栈顶帧为被分配对象的类,计数器为堆压力(分配的 TLAB 或 TLAB 之外对象的总大小)。适用于定位内存分配热点与高频对象创建。
Wall-clock
Wall-Clock 模式让 async-profiler忽略线程状态,每隔固定周期对所有线程(Running、Sleeping、Blocked)一视同仁地采样。例如可用于剖析应用启动阶段的时间开销。
Lock
锁剖析模式下,栈顶帧为锁/监视器(lock/monitor)的类,计数器为进入该锁/监视器所花费的纳秒数。适用于定位锁竞争与阻塞问题。
ITIMER
当无法使用perf_events时,可回退到 ITIMER 模式。它与 CPU 模式类似,但不要求perf_events支持;缺点是没有内核栈轨迹,仅能看到用户态调用栈。
平台要求
由于 Profiler 由 async-profiler 驱动,其运行平台必须受 async-profiler 支持:
| 官方维护的构建 | 其他可用移植版本 | |
|---|---|---|
| Linux | x64、arm64 | x86、arm32、ppc64le、riscv64、loongarch64 |
| macOS | x64、arm64 |
在上述清单之外的平台上进行剖析会失败,错误信息会显示在剖析列表的Message列中。
通过 Flink Web UI 使用 Profiler
Flink 用户可以完全通过 Web UI 完成剖析的提交与结果导出,操作便捷:
定位目标组件:在 Flink Web UI 中找到存在性能瓶颈的候选 TaskManager / JobManager,切换到对应的组件详情页(Profiler标签页)。Web Dashboard 中对应的页面组件分别为 task-manager-profiler.component.html 与 job-manager-profiler.component.ts。
创建剖析实例:点击Create Profiling Instance按钮,即可提交一个指定时长与模式的剖析实例。表单中可选择:
- Profiling Duration:剖析时长(秒),前端默认为 30,步进 30,最小 1,受后端
rest.profiling.duration-max上限约束; - Profiling Mode:CPU / Lock / Wall-Clock / Allocation / ITIMER 五种模式下拉选择,将鼠标悬停在对应模式上会显示该模式的语义说明(tooltip 文案与官方文档一致,见 task-manager-profiler.component.html)。
- Profiling Duration:剖析时长(秒),前端默认为 30,步进 30,最小 1,受后端
下载结果:剖析实例完成后,在剖析列表中点击结果链接即可下载交互式 HTML 文件(火焰图),可离线放大、检索与定位热点调用栈。
剖析列表以表格形式展示,每行包含:Index、Trigger Time(触发时间)、Finished Time(完成时间)、Profiling Duration、Mode、Status、Link(结果文件下载链接)、Message(状态信息)等字段(见 task-manager-profiler.component.html)。
剖析实例的状态机定义在 ProfilingInfo.java 中:
- RUNNING:剖析进行中,此时 Web UI 会拒绝再次创建实例(前端提示 "Please wait for last profiling finished.");
- FINISHED:剖析成功,
Message为 "Profiling Successful",outputFile指向可下载的结果文件; - FAILED:剖析失败,
Message携带具体失败原因(如启动/停止剖析失败的错误响应)。
若功能未启用(rest.profiling.enabled为 false),Profiler 页面会显示警告横幅,提示需要先设置该配置(见 task-manager-profiler.component.html)。
Troubleshooting:常见故障排查
1. CPU 模式剖析失败:No access to perf events. Try --fdtransfer or --all-user option or 'sysctl kernel.perf_event_paranoid=1'
该错误表示perf_event_open()系统调用失败。默认情况下,Docker 容器会限制对perf_event_open系统调用的访问。推荐解决方案:回退到 ITIMER 剖析模式。它与 CPU 模式类似,但不要求perf_events支持;代价是没有内核栈轨迹。
2. Allocation 模式剖析失败:No AllocTracer symbols found. Are JDK debug symbols installed?
分配剖析需要 OpenJDK 调试符号(debug symbols)。请参考 async-profiler 官方文档中 "Installing Debug Symbols" 一节安装对应 JDK 的调试符号后重试。
更多异步剖析器自身的异常场景,可参考 async-profiler 官方文档的 Troubleshooting 页面(可通过 Web UI Profiler 页面的信息图标链接直达 async-profiler 的 Wiki)。
实践建议
- 先验证再上生产:Profiler 是实验性功能,务必先在开发/预生产环境验证其对业务的影响与结果质量,再决定是否在生产启用;
- 优先 CPU 与 Wall-clock:大多数性能问题先用 CPU 模式定位计算热点;启动耗时类问题(如作业启动、恢复阶段)改用 Wall-clock 模式更合适;
- 锁问题用 Lock 模式:当怀疑线程阻塞、锁竞争时,Lock 模式能直接给出进入锁/监视器耗时最大的调用栈;
- 内存热点用 Allocation 模式:定位高频对象分配时使用,同时注意确保 JDK 调试符号已安装;
- 容器环境注意权限:Docker/Kubernetes 等容器化部署默认限制
perf_event_open,可直接采用 ITIMER 模式规避; - 管理好结果目录:关注
rest.profiling.dir指向的磁盘空间与rest.profiling.history-size的滚动清理策略,避免长时间高频剖析导致结果文件堆积。
通过以上配置、操作与排查手段,你可以在不重启集群的前提下,对 Flink 的 JobManager 与 TaskManager 进行细粒度的在线剖析,快速定位 CPU、锁、分配与时钟相关的性能瓶颈。
- 大数据
- 流处理
- 批处理
- 数据工程
【免费下载链接】flink
相关推荐
Flink Web UI 交互式 Profiler 使用指南:基于 async-profiler 剖析 JobManager / TaskManager
Flink Web UI 交互式 Profiler 使用指南:基于 async profiler 剖析 JobManager / TaskManager 自 F
大数据流处理批处理数据工程Apache Spark JVM Profiler 插件:基于 Async Profiler 的 Executor/Driver 代码剖析实战指南
Apache Spark JVM Profiler 插件:基于 Async Profiler 的 Executor/Driver 代码剖析实战指南 本文围绕 A
大数据数据分析批处理流处理机器学习图计算Arthas profiler 命令实战指南:基于 async-profiler 的火焰图与性能分析
Arthas profiler 命令实战指南:基于 async profiler 的火焰图与性能分析 导读 profiler 是 Arthas 提供的性能分析命
开发工具可观测性调试器性能剖析
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考