Flink系统知识讲解之:如何识别反压的源头
Flink系统知识之:如何识别反压的源头

什么是反压
Ufuk Celebi 在一篇古老但仍然准确的文章中对此做了很好的解释。如果您不熟悉这个概念,强烈推荐您阅读这篇文章。如果想更深入、更低层次地了解该主题以及 Flink 网络协议栈的工作原理,这里有更高级的解释。
在更高层次上,如果Flink作业图中的某些操作符算子无法以与接收记录相同的速度处理记录,就会产生反压。这就会填满运行较慢操作符的子任务的输入缓冲区。一旦输入缓冲区满了,反压就会传播到上游子任务的输出缓冲区。一旦这些缓冲区被填满,上游子任务也会被迫降低其处理记录的速度,以匹配造成瓶颈的操作符的处理速度。反压会进一步向上传播,直至到达source操作符。
只要负载和可用资源是静态的,并且没有操作符产生短时间的数据(如窗口操作符),这些输入/输出缓冲区就只会处于两种状态之一:几乎空或几乎满。如果下游操作符或子任务能够跟上数据流入的速度,缓冲区就会是空的。否则,缓冲区就会满[1]。事实上,检查缓冲区的使用指标正是几年前 Nico Kruber 推荐的检测和分析背压方法的基础。正如我在开头提到的,Flink 现在提供了更好的工具来完成同样的工作,但在此之前,有两个问题值得一问。
为什么要关注反压
反压是机器或操作符超负荷工作的指标。反压的积累会直接影响Flink系统的端到端延迟,因为记录在队列中等待的时间会更长,然后才会被处理。其次,在反压情况下,Checkpoint对齐的时间会更长,而非对齐Checkpoint的大小会更大(阻塞在输入/输出队列的数据会更多)(有关对齐和未对齐Checkpoint的更多信息,请参阅文档)。如果你正在为checkpoint barrier的传播时间而苦恼,考虑反压的存在很可能有助于解决问题。
为了解决作业的某些性能问题,我们需要意识到反压这个问题,然后对其进行定位和分析。
为什么不该关心反压
坦率地说,您不必总是关心是否存在反压。从定义上讲,缺乏反压可能意味着您的Flink作业至少存在轻微的利用不足和超额配置。如果想尽量减少闲置资源,可能会无法避免的产生一些反向压力。这对于批处理来说尤其如此。
如何检测和追踪反压的源头
检测反压的一种方法是使用Flink提供的Metrics,但在 Flink 1.13 中,不再需要如此深入地挖掘这些指标。因为在大多数情况下,只需查看 Web UI 中的作业图即可。

在上面的示例图中,首先要注意的是不同的任务有不同的颜色。这些颜色代表两个因素的组合:任务的反压程度和繁忙程度。空闲的任务为蓝色,完全繁忙的任务为红色,完全反压的任务为黑色。介于两者之间的任务将是这三种颜色的组合。
有了这些知识,我们就能很容易地发现反压任务(黑色)。反压任务下游最繁忙的任务(红色)很可能就是反压的来源(瓶颈)。
如果单击某项任务并进入 "BackPressure "选项卡,就可以进一步分析每个子任务的问题,查看该任务中每个子任务的反压/闲置状态。例如,通过该选项卡可以方便地发现如果任务存在数据倾斜,而且并非所有子任务的利用率都相同的情况:

在上面的示例中,我们可以清楚地看到哪些子任务处于空闲状态,哪些子任务处于反压状态,而且没有一个子任务处于忙碌状态。坦率地说,这足以让我们快速了解Flink应用发生了什么。不过,还有一些细节值得解释。
这些数值表示什么?
如果你对它的工作原理感到好奇,我们可以深入了解一下。我们有三个新指标,每个子任务都会显示和计算这三个指标:
- idleTimeMsPerSecond
- busyTimeMsPerSecond
- backPressuredTimeMsPerSecond
这些指标分别测量每秒内子任务空闲、忙碌或反向压力所花费的平均时间(以毫秒为单位)。除了一些舍入误差外,它们应该相互补充,加起来达到1000ms/s。从本质上讲,它们与CPU使用指标非常相似。
另一个重要细节是,它们是在短时间内(几秒钟)的平均值,并考虑了子任务线程内发生的一切:操作符、函数、定时器、检查点、记录序列化/反序列化、网络堆栈和其他 Flink 内部开销。如果 一个WindowOperator 算子忙于触发定时器并产生结果,则会被报告为繁忙或反压。在 CheckpointedFunction#snapshotState 调用中进行的昂贵计算(例如刷新内部缓冲区)也会被报告为繁忙。
但有一个局限性,即 busyTimeMsPerSecond 和 idleTimeMsPerSecond 指标对子任务执行主线程之外的独立线程中发生的任何事情都是视而不见的。不过,这只与两种情况有关:
- 在操作符中手动生成的自定义线程(不鼓励这种做法)。
- 实现已废弃 SourceFunction 接口的旧式数据源。此类数据源会将 NaN/N/A 报告为 busyTimeMsPerSecond 的值。
为了在 Web UI 中显示这些原始指标数据,需要汇总所有子任务的这些指标(在Job Graph中,只会显示Task)。这就是为什么Web UI会显示给定任务的所有子任务的最大值,以及为什么繁忙和反压的最大值加起来可能不是 100%。一个子任务的反压可能是 60%,而另一个子任务的繁忙可能是 60%。这可能导致一个任务既有 60% 的反压,又有 60% 的繁忙度。
负载变化
另外,由于这些指标是在几秒钟内计算得到的平均值,因此在分析具有不同负载的作业或任务时,例如包含周期性触发的WindowOperator的(子)任务,负载恒定为 50% 的子任务和每秒在完全繁忙和完全闲置之间交替的子任务都将报告相同的 busyTimeMsPerSecond 值(500ms/s)。
此外,不同的负载,尤其是类似窗口操作,会将瓶颈转移到作业图中的不同位置:

两项任务交替出现的瓶颈:

在这个特定的示例中,只要 SlidingWindowOperator 还在累积记录,它就是瓶颈。但是,一旦它开始启动窗口(每 10 秒一次),下游任务 SlidingWindowCheckMapper -> Sink:SlidingWindowCheckPrintSink 就会成为瓶颈,同时,SlidingWindowOperator 就会被反压。由于这些繁忙/反压/闲置指标是几秒钟内的平均时间,因此这一微妙变化无法立即显现。此外,Web UI每 10 秒钟才更新一次状态,这也使得发现更频繁的变化变得比较困难。
遇到反压能做什么?
总的来说,这是一个复杂的话题,值得专门撰写一篇博文。简而言之,处理反压有两种方法:要么增加更多资源(更多机器、更快的 CPU、更多内存、更好的网络、使用固态硬盘…),要么优化现有资源的使用(优化代码、调整配置、避免数据倾斜)。无论是哪种情况,首先都需要分析造成反压的原因:
- 分析出反压的存在。
- 确定是哪个子任务或哪台机器造成的。
- 深入挖掘代码的哪个部分导致了问题的出现,以及哪个资源是稀缺的。
反压监控指标可以帮助您解决前两点问题。要解决最后一个问题,则需要对代码进行剖析。从 Flink 1.13 开始,Flame Graphs 集成到了 Flink 的 Web UI中,为剖析提供了帮助。Flame Graphs 是一种剖析工具和可视化技术,有兴趣的可以试一试。
但请记住,在找到瓶颈所在后,可以像分析其他非分布式应用程序一样对其进行分析(通过检查资源利用率、使用Code Profiler等)。通常情况下,解决此类问题没有灵丹妙药。您可以尝试扩大规模,但有时这样做并不容易,也不现实。
总之,上述对反压监控的改进让我们可以轻松检测到反压的来源,而 Flame Graphs 则可以帮助我们分析特定子任务导致问题的原因。这两项功能结合在一起,将使以前相当乏味的 Flink 作业调试和性能分析过程变得更加轻松!请升级到 Flink 1.13.x 并试用它们!
相关文章:
Flink系统知识讲解之:如何识别反压的源头
Flink系统知识之:如何识别反压的源头 什么是反压 Ufuk Celebi 在一篇古老但仍然准确的文章中对此做了很好的解释。如果您不熟悉这个概念,强烈推荐您阅读这篇文章。如果想更深入、更低层次地了解该主题以及 Flink 网络协议栈的工作原理,这里有…...
RK3568平台(USB篇)禁用USB端口
一.linux中怎样查看usb的端口号 在USB口插入U盘: [ 198.141319][ T106] usb 3-1.3: new SuperSpeed Gen 1 USB device number 5 using xhci-hcd [ 198.161695][ T106] usb 3-1.3: New USB device found, idVendor=0781, idProduct=5591, bcdDevice= 1.00 [ 198.161721]…...
洛谷 P3000 [USACO10DEC] Cow Calisthenics G
思路 题目要求断若干条边后形成的连通块中,最大的直径最小,很明显的二分。关键就在于如何写 c h e c k check check 函数了。 可以用 d f s dfs dfs 来判断要断哪条边。 一、 d [ u ] d[u] d[u] 定义 设 d [ u ] d[u] d[u] 为从 u u u 出发到子树…...
Web渗透测试之XSS跨站脚本攻击 盲打 详解
目录 XSS盲打 什么是盲打: 盲打主要目的 XSS盲打 什么是盲打: 发现某个页面有xss漏洞 但是注入后没看到效果 而是在其它页面进行xss显示的效果 这种就叫盲打. 我注册了一个网站的用户 注册页面存在xss漏洞跳转到首页 看不到注册信息的输出 当管理员打开页面查看什么用户…...
经典编程题:服务器广播
题目描述: 服务器连接方式包括直接相连,间接连接。A 和 B 直接连接,B 和 C 直接连接,则 A 和 C 间接连接。直接连接和间接连接都可以发送广播。 给出一个 N*N 数组,代表 N 个服务器,matrix[i][j]1…...
【网络协议】静态路由详解
网络中的路由器通过以下两种方式之一发现远程网络: 静态配置路由动态路由协议 在本文,我们将学习关于静态路由的各种概念,例如如何配置静态路由、路由表如何进行决策、路由接口等相关知识。 文章目录 引言直连网络静态路由路由表原则原则1原…...
朝天椒USB服务器在银泰证券虚拟化超融合场景的应用案例
在数字化浪潮席卷金融行业的今天,银泰证券作为业内知名的金融机构,始终致力于提升业务运营效率与数据安全性。面对虚拟化超融合场景下各种认证U盾的管理挑战,银泰证券选择了朝天椒USB服务器作为其解决方案,成功实现了U盾在虚拟机中…...
.NET framework、Core和Standard都是什么?
对于这些概念一直没有深入去理解,以至于经过.net这几年的发展进化,概念越来越多,越来越梳理不容易理解了。内心深处存在思想上的懒惰,以为自己专注于Unity开发就好,这些并不属于核心范畴,所以对这些概念总是…...
FairGuard游戏安全2024年度报告
导 读:2024年,国内游戏市场实际销售收入3257.83亿元,同比增长7.53%,游戏用户规模6.74亿人,同比增长0.94%,市场收入与用户规模双双实现突破,迎来了历史新高点。但游戏黑灰产规模也在迅速扩大&…...
JetBrains IDEs和Visual Studio Code的对比
JetBrains IDEs和Visual Studio Code的对比 JetBrains IDEs是捷克JetBrains公司开发的一系列集成开发环境(IDE)。以下是具体介绍:IntelliJ IDEA是JetBrains 公司的一款产品 主要产品 IntelliJ IDEA:一款功能强大且广泛应用的Java集成开发环境,有开源免费的社区版和商业收…...
文件剪切走:深度解析与高效恢复策略
一、文件剪切走现象解读 在计算机的日常使用中,“文件剪切走”这一术语形象地描述了文件在移动过程中意外丢失的现象。当用户尝试将文件从一个位置“剪切”并粘贴到另一个位置时,如果操作不当或系统出现异常,可能会导致文件在源位置消失&…...
Win32汇编学习笔记09.SEH和反调试
Win32汇编学习笔记09.SEH和反调试-C/C基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net SEH - structed exception handler 结构化异常处理 跟筛选一样都是用来处理异常的,但不同的是 筛选器是整个进程最终处理异常的函数,但无法做到比较精细的去处理异常(例如处理…...
[人工智能]CSDN创作助手体验
一、什么是智能体 智能体是一种能够感知环境、学习、推理和行动的实体。它可以是一个计算机程序、机器人或其他类似的系统。智能体的目标是通过与环境的交互来实现特定的任务或目标。 智能体通常由以下几个组件组成: 感知器:感知器是智能体与环境之间的…...
vue3中el-table实现多表头并表格合并行或列
1、el-table中添加事件 :span-method"genderSpanCity" <el-table :span-method"genderSpanCity":data"data.tableData":fit"true" table-layout"fixed" header-align"center" stripestyle"width:100%;he…...
HTML+CSS+JS制作中国传统节日主题网站(内附源码,含5个页面)
一、作品介绍 HTMLCSSJS制作一个中国传统节日主题网站,包含首页、节日介绍页、民俗文化页、节日活动页、联系我们页等5个静态页面。其中每个页面都包含一个导航栏、一个主要区域和一个底部区域。 二、页面结构 1. 顶部横幅区 包含传统中国风格的网站标题中国传统…...
时空笔记:CBEngine(微观交通模拟引擎)
CBEngine 是一个微观交通模拟引擎,可以支持城市规模的道路网络交通模拟。CBEngine 能够快速模拟拥有数千个交叉路口和数十万辆车辆的道路网络交通。 以下内容基本翻译自CBEngine — CBLab 1.0.0 documentation 1 模拟演示 1.0 模拟演示结构 config.cfg 定义了 roa…...
【LeetCode】力扣刷题热题100道(26-30题)附源码 轮转数组 乘积 矩阵 螺旋矩阵 旋转图像(C++)
目录 1.轮转数组 2.除自身以外数组的乘积 3.矩阵置零 4.螺旋矩阵 5.旋转图像 1.轮转数组 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 class Solution { public:void rotate(vector<int>& nums, int k) …...
【C++】字符串的 += 和 + 运算详解
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯1. 字符串的 和 基本用法1.1 的用法1.2 的用法 💯2. 示例代码的剖析与解释代码分析 💯3. 底层实现与性能分析3.1 的实现原理3.2 的实现原理3.…...
多模态大模型部署:结合dify
文章目录 前言minicpm-vDify测试一下总结部署过程回顾集成与测试实验结果分析展望未来 前言 上回说道,我们用ollama部署了一个多模态的大模型,也就是minicpm-v: 但这玩意儿感觉只能打字啊。 怎么给它发图片呢? minicpm-v Mini…...
Matlab Steger提取条纹中心(非极大值抑制)
文章目录 一、简介二、实现代码三、实现效果一、简介 由于在确定条纹的ROI区域之后,会计算出多个条纹中心坐标,因此这里就需要对其进行则优选择,毕竟条纹只有一条,这最简单的方式就是使用非极大值抑制,即选择每一行/列最好的条纹中心。 二、实现代码 Hessian2D.m function…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
