☰
Flink 交互式性能剖析(Profiler)实战指南:基于 async-profiler 的 JobManager/TaskManager 在线采样
2026/9/25 8:46:54 网站建设 项目流程
  • 大数据
  • 流处理
  • 批处理
  • 数据工程

【免费下载链接】flink

项目地址:https://gitcode.com/gh_mirrors/fli/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.enabledBooleanfalse启用实验性 Profiler 功能,即本功能的开关
rest.profiling.history-sizeInteger10JobManager 或每个 TaskManager 维护的最大剖析历史实例数;超过后按滚动策略移除最旧实例
rest.profiling.duration-maxDuration300 s单次剖析请求允许的最大时长;超过该值的请求将被拒绝
rest.profiling.dirStringjava.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 支持:

官方维护的构建其他可用移植版本
Linuxx64、arm64x86、arm32、ppc64le、riscv64、loongarch64
macOSx64、arm64

在上述清单之外的平台上进行剖析会失败,错误信息会显示在剖析列表的Message列中。

通过 Flink Web UI 使用 Profiler

Flink 用户可以完全通过 Web UI 完成剖析的提交与结果导出,操作便捷:

  1. 定位目标组件:在 Flink Web UI 中找到存在性能瓶颈的候选 TaskManager / JobManager,切换到对应的组件详情页(Profiler标签页)。Web Dashboard 中对应的页面组件分别为 task-manager-profiler.component.html 与 job-manager-profiler.component.ts。

  2. 创建剖析实例:点击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)。
  3. 下载结果:剖析实例完成后,在剖析列表中点击结果链接即可下载交互式 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

项目地址:https://gitcode.com/gh_mirrors/fli/flink
点击查看免费下载

相关推荐

上一篇:XMRig v6.x 版本演进全景解读:从 RandomX v2、RISC-V 支持到 GhostRider 的统一 CPU/GPU 挖矿技术路线图
下一篇:PyTorch语义分割配置文件解析:JSON格式的完整参数说明指南 🎯

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询