什么是反压
如果你看到一个 Task 发生 反压警告(例如: High
),意味着它生产数据的速率比下游 Task 消费数据的速率要快。 在工作流中数据记录是从上游向下游流动的(例如:从 Source 到 Sink)。反压沿着相反的方向传播,沿着数据流向上游传播。
以一个简单的 Source -> Sink
Job 为例。如果看到 Source
发生了警告,意味着 Sink
消费数据的速率比 Source
生产数据的速率要慢。 Sink
正在向上游的 Source
算子产生反压。
Task(SubTask)的每个并行实例都可以用三个一组的指标评价:
backPressureTimeMsPerSecond
,subtask 被反压的时间idleTimeMsPerSecond
,subtask 等待某类处理的时间busyTimeMsPerSecond
,subtask 实际工作时间 在任何时间点,这三个指标相加都约等于1000ms
。
指标值说明:
- OK: 0 <= 比例 <= 0.10
- LOW: 0.10 < 比例 <= 0.5
- HIGH: 0.5 < 比例 <= 1
反压问题定位
可以看各个operator的metrics的指标,比如:buffers.outPoolUsage、buffers.inPoolUsage、buffers.inputFloatingBuffersUsage、buffers.inputExclusiveBuffersUsage;
接收端共用一个LocalBufferPool,接收端每个Channel在初始化阶段都会分配固定数量的Buffer(Exclusive Buffer)。如果某一时刻接收端接受到的数量太多,Exclusive Buffer就会耗尽,此时就会向BufferPool申请剩余的Floating Buffer(除了Exclusive Buffer,其他的都是Floating Buffer,备用Buffer);inPoolUsage = floatingBuffersUsage + exclusiveBuffersUsage
- 若 inPoolUsage 低,而 outPoolUsage 低,则说明完全没有背压现象。
- 若 inPoolUsage 低,而 outPoolUsage 高,则说明处于临时状态,可能是背压刚开始,也可能是刚结束,需要再观察。
- 若 inPoolUsage 高,而 outPoolUsage 低,那么通常情况下这个算子就是背压的根源了。
- 若 inPoolUsage 高,而 outPoolUsage 高,则说明这个算子是被其他下游算子反压而来的,并不是元凶。
在反压定位过程中,建议关闭 Operator Chaining 优化,这样所有的算子可以单独拆分出来,不会相互干扰:
pipeline.operator-chaining: false