测试反压可以快速的定位流处理系统的性能瓶颈所在。先在Kafka中积攒一批数据,然后在使用Flink消费,就好比水库泄洪,很容易找到下游性能薄弱的环节。
反压的可能原因
反压的原因可能会有:
- 短时间的负载高峰,超过流处理系统极限
- 下游sink负载变大,数据无法及时输出
- GC压力过大,停顿时间太长
- 某个算子作业过于复杂,执行耗时较长
- 集群网络波动,上游传递给下游的网络通道受阻
定位方式
定位之前禁用掉OperatorChain,这样原本chain到一起的多个算子会分开,方便我们更精细的定位性能瓶颈。
- 看页面:查看Flink Web UI中对应算子的Back Pressure页面,如果各个SubTask显示的结果为High,说明该算子存在反压情况。
- 看监控:查看算子的inPoolUsage监控项。如果数值过高,说明存在反压。
找到反压算子之后,我们可以使用Flame Graph火焰图,来分析每个方法调用的耗时,从而找到耗时较长的方法。
开启火焰图的方法:
在flink-conf.yaml
中配置。
参数 | 默认值 | 含义 |
---|---|---|
rest.flamegraph.enabled | false | 是否开启火焰图 |
rest.flamegraph.cleanup-interval | 10min | 统计信息的缓存清除时间 |
rest.flamegraph.delay-between-samples | 50 ms | 构建 FlameGraph 的单个堆栈跟踪样本之间的延迟 |
rest.flamegraph.num-samples | 100 | 构建flamegraph的采样数 |
rest.flamegraph.refresh-interval | 1 min | 火焰图刷新的时间间隔 |
rest.flamegraph.stack-depth | 100 | 创建FlameGraphs 的堆栈跟踪的最大深度 |
一些通用的方法:
- 优化反压算子的业务逻辑代码
- 调用外部系统使用AsyncFunction
- 增大TM的内存资源
- 增大反压算子的并行度
- 减少反压上游算子的并行度