赞
踩
Flink社区在FLIP-49提出了新版统一的TaskManager内存模型及配置,这也是Flink 1.10版本最主要的改进与优化点之一。根据社区的说法,该proposal致力于解决1.9版本及之前的TM内存配置的三个缺点:
由于内存模型发生了变化,所以Flink 1.10作业的内存配置参数也与1.9版本之前有比较大的区别,本文就来具体看一看,防止生产环境中踩坑。
官方给出的图示如下。
下面看图说话,分区域介绍之。
taskmanager.memory.flink.size
:无默认值,需要用户指定。taskmanager.memory.framework.heap.size
:堆内部分(Framework Heap),默认值128MB;taskmanager.memory.framework.off-heap.size
:堆外部分(Framework Off-Heap),以直接内存形式分配,默认值128MB。taskmanager.memory.managed.fraction
:托管内存占Flink总内存taskmanager.memory.flink.size
的比例,默认值0.4;taskmanager.memory.managed.size
:托管内存的大小,无默认值,一般也不指定,而是依照上述比例来推定,更加灵活。taskmanager.memory.network.min
:网络缓存的最小值,默认64MB;taskmanager.memory.network.max
:网络缓存的最大值,默认1GB;taskmanager.memory.network.fraction
:网络缓存占Flink总内存taskmanager.memory.flink.size
的比例,默认值0.1。若根据此比例算出的内存量比最小值小或比最大值大,就会限制到最小值或者最大值。taskmanager.memory.task.heap.size
:堆内部分(Task Heap),无默认值,一般不建议设置,会自动用Flink总内存减去框架、托管、网络三部分的内存推算得出。taskmanager.memory.task.off-heap.size
:堆外部分(Task Off-Heap),以直接内存形式分配,默认值为0,即不使用。taskmanager.memory.process.size
:无默认值,需要用户指定。taskmanager.memory.jvm-metaspace.size
:默认值256MB。含义
为JVM预留的其他本地内存,用于线程栈、代码缓存等,作用有些类似于之前版本中为容器预留的截断(cutoff)内存。当然在1.10版本中,原先的containerized.heap-cutoff-ratio
与containerized.heap-cutoff-min
参数对TM就不再生效了。
参数
taskmanager.memory.jvm-overhead.min
:JVM额外开销的最小值,默认192MB;taskmanager.memory.jvm-overhead.max
:JVM额外开销的最大值,默认1GB;taskmanager.memory.jvm-overhead.fraction
:JVM额外开销占TM进程总内存taskmanager.memory.process.size
(注意不是Flink总内存)的比例,默认值0.1。若根据此比例算出的内存量比最小值小或比最大值大,就会限制到最小值或者最大值。上述内存参数会直接影响启动TaskManager时使用的JVM参数,使用相关工具可以观察到。
-Xmx
/-Xms
:对应堆内框架内存与任务内存之和;-XX:MaxDirectMemorySize
:对应三块直接内存,即堆外框架内存、任务内存与网络缓存之和;-XX:MaxMetaspaceSize
:对应JVM元空间设置。一大堆参数看得人眼花缭乱,但实际用起来并不需要管那么多。简而言之:
taskmanager.memory.flink.size
;taskmanager.memory.process.size
。其他部分内存的分配大可交给Flink本身去决定。如果需要依照业务特点做微调的话,建议首先修改网络缓存占比taskmanager.memory.network.fraction
(根据网络流量大小)与托管内存占比taskmanager.memory.managed.fraction
(根据RocksDB状态大小等),进而能够间接影响任务内存的配额。手动指定较多的参数——特别是固定内存量的参数——容易使内存配额出现冲突,导致部署失败,要小心。
假设Flink on YARN环境,设置如下:
- taskmanager.memory.process.size = 4096 MB
- taskmanager.memory.network.fraction = 0.15
- taskmanager.memory.managed.fraction = 0.45
可以推算得出各内存指标为:
- taskmanager.memory.jvm-overhead = 4096 * 0.1 = 409.6 MB
- taskmanager.memory.flink.size = 4096 - 409.6 - 256 = 3430.4 MB
- taskmanager.memory.network = 3430.4 * 0.15 = 514.56 MB
- taskmanager.memory.managed = 3430.4 * 0.45 = 1543.68 MB
- taskmanager.memory.task.heap.size = 3430.4 - 128 * 2 - 1543.68 - 514.56 = 1116.16 MB
民那晚安晚安。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。