Flink1.10内存模型

Flink1.10的内存管理发生部分变化,笔者基于官方文档对主要变更做了分析,将Flink1.10中内存设置等总结出本文。

Flink1.10内存模型

Flink内存模型
如上图,最外层是Flink进程内存,即Flink相关进程的JVM内存,通常容器部署设置这个参数即可。内层的 Total Flink Memory是去除部分JVM元数据区等内存后的部分,通常独立集群设置这个参数即可。其次,Flink总内存分为堆上内存和非堆内存。注意,非堆内存包括了直接内存和Flink Managed内存。Flink Managed内存在1.10之前是可配置使用堆内存或非堆内存的,1.10中其被固定为使用Native内存。
此外,注意查看上图中的虚线,JVM特定内存不属于Flink总内存中。

Flink1.10内存设置

如下给出官方推进的3种内存设置方式,Flink各种部分内存大多数都有默认值,或默认比例值,因此只需要给出部分关键内存配置即可。

方式1

指定 taskmanager.memory.flink.size 参数,该参数表示Flink占用的总内存,各部分的内存都基于此总内存按照比例等其他方法计算得出。

方式2

指定 taskmanager.memory.process.size,该参数区别于 taskmanager.memory.flink.size,少了JVM特定内存。

方式3

指定 taskmanager.memory.task.heap.size 和 taskmanager.memory.managed.size,即直接指定了堆内存和Flink Managed内存的大小。

Flink1.10内存验证

笔者通过Flink1.10的下载包部署单机Flink独立集群对内存做了验证。配置基于默认配置微调,主要调整为注释 taskmanager.memory.process.size,解除注释 taskmanager.memory.flink.size,这符合前文所讲,独立集群推进使用方式1设置内存。
按照此设置启动之后,通过 ps -ef 命中查看TaskManager的JVM启动参数如下。

-Xmx536870902(512MB) -Xms536870902(512MB)

-XX:MaxDirectMemorySize=268435458 (256MB)

-D taskmanager.memory.framework.off-heap.size=134217728b(128MB)框架非堆内存

-D taskmanager.memory.network.max=134217730b (128MB)网络内存最大

-D taskmanager.memory.network.min=134217730b (128MB)网络内存最小

-D taskmanager.memory.framework.heap.size=134217728b (128MB)框架堆内存

-D taskmanager.memory.managed.size=536870920b(512MB)Flink Managed内存

-D taskmanager.memory.task.heap.size=402653174b(384MB)用户堆内存

-D taskmanager.memory.task.off-heap.size=0b (128MB)用户非堆内存

如上,这些内存实际计算逻辑如下。
总内存 = 1280MB(1.10下载包的默认配置值)
网络内存 = 总内存 * 0.1 = 128MB(默认比例,默认最大最小限制)
Flink Managed内存 = 总内存 * 0.4 = 512MB(默认比例)
框架堆内存 = 128MB(默认值)
框架堆下内存 = 128MB(默认值)
用户堆下内存 = 0MB(默认值)
用户堆内存 = 总内存 - 网络内存 - Flink Managed内存 - 框架堆内存 - 框架堆下内存 - 用户堆下内存 = 384MB

总体计算关系即为如上,具体部分是默认值,以及默认比例,默认限制等,这些默认值会在后文中讲Flink内存相关参数时给出。

Flink1.10内存参数

参数 参数类型 默认值 描述
taskmanager.memory.flink.size MemorySize None 总内存设置(不包括JVM特定内存)
taskmanager.memory.managed.fraction Float 0.4 Flink Managed内存比例(Native内存)
taskmanager.memory.managed.size MemorySize None Flink Managed内存(优先于比例)(Native内存)
taskmanager.memory.network.fraction Float 0.1 网络缓冲区内存(直接内存)
taskmanager.memory.framework.off-heap.size MemorySize 128mb 框架堆下内存(直接内存)
taskmanager.memory.task.off-heap.size MemorySize 0 用户堆下内存(直接内存)
taskmanager.memory.framework.heap.size MemorySize 128mb 框架堆内存
taskmanager.memory.task.heap.size MemorySize None 用户堆内存
taskmanager.memory.jvm-metaspace.size MemorySize 256MB 总内存设置(不包括JVM特定内存)

其他

注意,对于流任务来说,Flink Managed内存并无用,可以设置很小即可。

笔者推荐

下面是针对流任务,机器可用内存在60G+情况配置。
taskmanager.memory.flink.size: 40960m(尽可能取整,方便内存认为计算和管理)
taskmanager.memory.framework.heap.size: 512m
taskmanager.memory.framework.off-heap.size: 512m
taskmanager.memory.managed.size: 512m(流任务不需要设置太高)
taskmanager.memory.network.fraction: 0.1
taskmanager.memory.network.min: 1gb
taskmanager.memory.network.max: 2gb
taskmanager.memory.segment-size: 128kb(此参数根据具体情况调整)

猜你喜欢

转载自blog.csdn.net/u013887254/article/details/105199075