
# Flink性能优化
**概述**
Flink是一个批处理和流处理结合的统一计算框架，其核心是一个提供了数据分发以及并行化计算的流数据处理引擎。它的最大亮点是流处理，是业界最顶级的开源流处理引擎。Flink最适合的应用场景是低时延的数据处理（Data Processing）场景：高并发pipeline处理数据，时延毫秒级，且兼具可靠性。
**集群服务部署架构**
**服务规模与业务容量参数配置**
Flink作为流数据处理引擎，依赖内存和CPU。用户在规划规格时，应根据当前的业务容量和增长速度，规划合理的内存和CPU资源，特别需要关注以下几点：
- 根据自己的业务目标，规划CPU资源和内存资源。规划时，需要结合当前的数据分布情况，业务复杂度，设置JobManager的内存，TaskManager的数量，TaskManager的内存，每个TaskManager的slot数量，规划适当的CPU核数和内存大小。
- 在规划内存时，要预留一定量的内存空间作为操作系统的buffer cache，一般预留20%。
- 从HDFS中读入数据时，要考虑block解压缩后的数据膨胀。
- 规划一定的磁盘作为缓存空间，包括缓存数据与日志。
**调优目标**
Flink调优的目标是在不影响其他业务正常运行的前提下，高效地完成业务目标，通常为了达成该目标，一般需要最大限度利用集群的物理资源，如CPU、内存、磁盘IO，使其某一项达到瓶颈。
**调优原则**
- 提高CPU使用率同时减少额外性能开销。

- 提高内存使用率。

- 优化业务逻辑，减少计算量和IO操作。
**性能调优常用方法-DataStream调优**
- 配置内存：调整老年代和新生代的比值；开发Flink应用程序时，优化datastream的数据分区或分组操作。
- 设置并行度：用户可以根据实际的内存，CPU，数据以及应用程序逻辑的情况调整并行度参数。任务的并行度可以按优先级从高到低排列，由算子层次、执行环境层次、客户端层次、系统层次这四种层次指定。
- 配置进程参数：配置JobManager内存、TaskManager个数、TaskManager Slot数、TaskManager内存。
- 设计分区方法：可设置随机分区、rebalancing（round-robin partitioning，基于round-rebin对元素进行分区，使得每个分区负责均衡）、rescaling（以round-robin的形式将元素分区到下游操作的子集中）、广播分区（广播每个元素到所有分区）、自定义分区。
- 配置netty网络通信：可在客户端的"conf/flink-conf.yaml"配置文件中进行修改适配。
**指标观测方法**
性能衡量指标包含吞吐量、资源利用率、伸缩性。
- 吞吐量：在相同资源环境下，执行相同计算任务，查看任务的完成速度。
- 资源利用率：执行计算任务，查看在不同负载情况下，CPU、内存、网络的使用率。
- 伸缩性：
− 横向扩容带来的性能提升曲线：增加资源，执行相同计算任务，查看性能提升比率。
− 增加系统负担带来的性能下降曲线：在相同资源环境下，增加计算负载，查看性能下降比率。
