Flink1.10的内存管理发生部分变化,笔者基于官方文档对主要变更做了分析,将Flink1.10中内存设置等总结出本文。
Flink1.10内存模型
如上图,最外层是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(此参数根据具体情况调整)