新版内存模型与参数概览
官方给出的图示如下。
下面看图说话,分区域介绍之。
Flink总内存(Total Flink Memory)
- 含义
TaskManager进程占用的所有与Flink相关的内存(不包括JVM元空间和其他额外开销)。具体包含4大块:Flink框架内存(堆内、堆外)、托管内存(仅堆外)、网络缓存(仅堆外)、任务内存(堆内、堆外)。 - 参数
taskmanager.memory.flink.size:无默认值,需要用户指定。
Flink框架(Framework)内存
- 含义
Flink Runtime底层占用的内存,一般来讲相对固定,不需要更改。极特殊情况下才需要调大一些,比如非常高的算子并行度,或者与外部系统(如Hadoop)有密集交互等等。 - 参数
托管(Managed)内存
- 含义
纯堆外内存,由MemoryManager管理,用于中间结果缓存、排序、哈希表等,以及RocksDB状态后端。可见,RocksDB消耗的内存可以由用户显式控制了,不再像旧版本一样难以预测和调节。 - 参数
网络(Network)缓存
- 含义
纯堆外内存,用于TaskManager之间(shuffle、广播等)及与外部组件的数据传输,以直接内存形式分配。 - 参数
任务(Task)内存
TaskManager进程总内存(Total Process Memory)
- 含义
在容器化部署(on YARN/K8s/Mesos)环境下使用,是Flink总内存、JVM元空间与JVM额外内存开销的和,也就是容器本身的内存大小。 - 参数
taskmanager.memory.process.size:无默认值,需要用户指定。
JVM元空间(Metaspace)
JVM额外开销(Overhead)
-
含义
为JVM预留的其他本地内存,用于线程栈、代码缓存等,作用有些类似于之前版本中为容器预留的截断(cutoff)内存。当然在1.10版本中,原先的containerized.heap-cutoff-ratio与containerized.heap-cutoff-min参数对TM就不再生效了。 -
参数
Flink内存参数与JVM参数的关系
上述内存参数会直接影响启动TaskManager时使用的JVM参数,使用相关工具可以观察到。
- -Xmx/-xms:对应堆内框架内存与任务内存之和;
- -XX:MaxDirectMemorySize:对应三块直接内存,即堆外框架内存、任务内存与网络缓存之和;
- -XX:MaxMetaspaceSize:对应JVM元空间设置。
到底该如何配置?
一大堆参数看得人眼花缭乱,但实际用起来并不需要管那么多。简而言之:
- 如果是Standalone部署,就指定Flink总内存taskmanager.memory.flink.size;
- 如果是容器化部署,就指定TM进程总内存taskmanager.memory.process.size。
其他部分内存的分配大可交给Flink本身去决定。如果需要依照业务特点做微调的话,建议首先修改网络缓存占比taskmanager.memory.network.fraction(根据网络流量大小)与托管内存占比taskmanager.memory.managed.fraction(根据RocksDB状态大小等),进而能够间接影响任务内存的配额。手动指定较多的参数——特别是固定内存量的参数——容易使内存配额出现冲突,导致部署失败,要小心。
举个栗子呗
假设Flink on YARN环境,设置如下:
1 | taskmanager.memory.process.size = 4096 MB |
可以推算得出各内存指标为:
1 | taskmanager.memory.jvm-overhead = 4096 * 0.1 = 409.6 MB |
The End
https://www.codenong.com/cs105678146/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。