Flink任务问题分析与性能调优
作者: 吴培坚——虎牙实时计算平台研发工程师
1 性能分析:
Flink调优对于问题的定性很重要,只有先确定问题性质才能针对性优化。首先要明白,Flink是分布式流计算框架,可简单理解为多个相互通讯的有状态java进程,其调优本质跟普通的java程序大同小异。
1.1 问题定位的基础:
只有具备良好的的监控数据支持,才能感知问题/异常的发生并对其快速定位。
监控指标主要分为以下三个维度:
- Flink框架: 框架本身内嵌了很多方便运维调优的统计信息,极大方便了性能问题的定位。如:日志、反压系数、数据partition策略、数据传输指标、gc信息、延迟指标…
- 系统指标:操作系统本身的指标信息。如:oomkilled频率(容器环境)、内存用量、cpu负载、磁盘网络I/O…
- 进程/线程信息:TaskManager进程内的运行时信息,各线程算力负载信息、线程调度信息、Rocksdb线程负载…
1.2 性能问题主要归为两类:
- 稳定性: 此类一般是进程异常退出、jvm oom、容器节点内存溢出导致进程被操作系统杀死的oomkilled问题、容器pod驱逐、主机宕机等导致节点丢失任务频繁重启。
- 处理性能: 由于资源不足、i/o阻塞、程序逻辑等,导致的计算任务处理性能低下。稳定性低的任务往往也会有处理性能问题。
2 如何定位
2.1 稳定性问题:
稳定性问题非常直观,最终影响就是导致任务频繁的重启,这里只例举一些代表性原因:
原因及确定方式:
- 内存使用超出节点规格触发oomkilled。查看节点oomkilled记录,从节点内存指标可看出内存使用量达到100%后回落。 一般是内存不足、Rocksdb托管的内存溢出。
- TaskManager进程由于程序错误退出:查看具体丢失的taskmanager日志,可以看到TaskManager进程退出且正常关闭资源。 一般是程序代码不够鲁棒、内存配置问题导致。
- GC导致心跳超时:查看GC指标,GC日志。
- k8s驱逐:上述排查无异,查看k8s驱逐记录。 宿主机宕机、高负载节点驱逐(一般出现在高峰期)
如下图示Pod内存使用在1处达到100%,2显示TaskManager进程被操作系统kill,在3处删除pod后无监控点。这种都是节点出现oomkilled。
出现oomkilled时候,用户会收到告警。同时在"任务仪盘表页面-任务分析模块",会显示最近一天统计的oomkilled次数。
- 如何判定是Rocksdb导致内存溢出?
通过jemalloc分析可以看到大部分内存占用都消耗在Rocksdb的未压缩block上,基本上可以确定为Rocksdb导致。