Flink使用Side Output时吞吐量是否随输出通道数量成比例下降?
Flink Side Output 吞吐量下降问题解答
结论
这种吞吐量随Side Output通道数量成比例下降的行为不符合预期,属于使用Side Output时容易踩的性能坑,但可以通过调整用法或优化配置缓解。
原因拆解
- Side Output的底层机制:每个Side Output对应独立的输出缓冲区,ProcessFunction里把一条数据发往N个Side Output时,会触发N次序列化和数据拷贝操作——每条通道都要单独处理一遍数据。而直接把多个下游连到主输出时,Flink运行时会做共享转发优化:数据只序列化一次,再复制到多个下游的缓冲区,开销比多Side Output的重复处理小得多。
- 你的复现案例刚好验证了这点:
- 案例1里3个输出通道(不管是1主+2侧还是全侧输出),吞吐量降到原来的1/3,核心原因是单条数据被重复处理3次,CPU开销直接翻3倍,拉低了整体处理速度。
- 案例2、3没有重复处理的额外开销,吞吐量就保持正常水平。
优化方向
- 如果所有下游都需要全量数据,优先把多个下游直接连到主输出,别用Side Output做全量分发——Side Output的设计初衷是“分流”(部分数据走主输出,部分走侧输出),而非全量复制。
- 要是确实得用Side Output(比如有特定的过滤/分流逻辑),可以试试这些优化:
- 合并逻辑相近的Side Output,减少输出通道的数量。
- 开启Flink的对象重用(
env.getConfig().enableObjectReuse()),降低对象创建和拷贝的开销。 - 调整TaskManager的内存配置,给输出缓冲区分配足够资源,避免因缓冲区不足导致的阻塞。
内容的提问来源于stack exchange,提问作者keezar
相关产品推荐
相关产品推荐

