Jobmanage内存模型
1G 1C 的配置
上图不够直观,用户大脑无法第一反应出内存构成。
Total Process Memory = JVM堆内存 + JVM堆外内存(堆外内存+ JVM元空间 +JVM自身运行内存)
Total Flink Memory = JVM堆内存 + 堆外内存
参数控制:
Total Process Memory 对应 jobmanager.memory.process.size 。
Total Flink Memory 对应 jobmanager.memory.flink.size 。
Off-Heap Memory 堆外内存 对应 jobmanager.memory.off-heap.size 默认128mb。
JVM Metaspace 对应 jobmanager.memory.jvm-metaspace.size 默认256mb 。
JVM Overhead 用于 JVM 开销的本地内存,例如栈空间、垃圾回收空间等
-
jobmanager.memory.jvm-overhead.fraction:默认值 0.1(Total Process Memory的0.1)
-
jobmanager.memory.jvm-overhead.min:默认值192mb。
-
jobmanager.memory.jvm-overhead.max:默认值1gb。
1G内存,1024*0.1 = 102.4 <192. 所以默认192mb.
Total Process Memory = JVM堆内存 + JVM堆外内存(堆外内存+ JVM元空间 +JVM自身运行内存)
1024M = ? + 128M +256M + 192M
所以 jvm heap 的大小为 448M。
Taskmanage 内存模型
搞明白内存配置,默认配置及比例
生产环境内存如何配置
什么场景配置什么样的配置?
Total Flink Memory = JVM heap + Management Memory + Direct Meomory
Total Flink Memory = (①Framework Heap + ②Task Heap)
+ ③ Management Memory
+ (④ Framework Off-Heap +⑤Task Off-Heap + ⑥ Network)
Total Process Memory = Total Flink Memory + ⑦JVM Metaspace + ⑧JVM Overhead
进程内存3部分,flink总内存+ 元空间+ JVM运营内存。
Flink 总内存6部分,JVM内分F T heap;
JVM 外分 管理内存和直接内存 ;
直接内存分 网络内存和堆外FT off-heap;
参数控制:
Total Process Memory 对应 taskmanager.memory.process.size 。
Total Flink Memory 对应
包括6部分
① Framework heap 对应 taskmanager.memory.framework.heap.size 默认为128m
为Task Executor本身所配置的堆内存大小,因为Task Executor本身也是一个Java。Framework Heap是Flink框架保留的,是不会用来执行Task的。
②Task Heap 对应 taskmanager.memory.task.heap.size
默认为:
Total Flink Memory– Framework Heap -Framework Off-Heap – Managed Memory– Task off-heap memory – Network Memory
③Management Memory 对应 taskmanager.memory.managed.fraction 默认0.4 (Total Flink Memory的0.4)
纯堆外内存,由MemoryManager管理,用于中间结果缓存、排序、哈希表等,以及RocksDB状态后端。可见,RocksDB消耗的内存可以由用户显式控制了,不再像旧版本一样难以预测和调节。
④Framework Off-heap 对应 taskmanager.memory.framework.off-heap.size 默认为128M
为 Task Executor保留的off-heap memory,不会分配给任何slot。
⑤task Off-heap 对应 taskmanager.memory.task.off-heap.size来配置,默认为0。
为Task Executor执行的Task所使用的堆外内存。如果在Flink应用的代码中调用了Native的方法,需要用到off-heap内存,这些内存会分配到Off-heap堆外内存中。可以通过指定如果代码中需要调用Native Method并分配堆外内存,一般不使用。
⑥Network 对应
在Task与Task之间进行数据交换时(shuffle),需要将数据缓存下来,缓存能够使用的内存大小就是这个Network Memory。它由是三个参数决定:
-
taskmanager.memory.network.min:默认为64MB
-
taskmanager.memory.network.max:默认为1gb
-
taskmanager.memory.network.fraction:默认为0.1
Network Memory有两种配置方式
1、通过taskmanager.memory.network.fraction参数,默认为Total Flink Meory的10%。
2、通过taskmanager.memory.network.min和taskmanager.memory.network.max指定shuffle缓存在min-max之间的内存空间。如果使用fraction计算出来的Network Meory超出min-max的范围,那么以min-max为准。如果配置的min和max是一样的值,就使用固定的内存大小。
⑦JVM Metaspace 对应 taskmanager.memory.jvm-metaspace.size ,默认为256MB。
⑧JVM Overhead 保留给JVM其他的内存开销。例如:Thread Stack、code cache、GC回收空间等等。和Network Memory的配置方法类似,由三个配置决定:
-
taskmanager.memory.jvm-overhead.min:默认为192MB,
-
taskmanager.memory.jvm-overhead.max:默认为1GB
-
taskmanager.memory.jvm-overhead.fraction:默认为Total Process Memory 的0.1。
注意:Flink官方也建议我们不要同时配置taskmanager.memory.process.size和taskmanager.memory.process.size。
实战: tm 1c 1G 配置 参数
taskmanager.memory.process.size=1024M
taskmanager.memory.managed.fraction=0.01
taskmanager.memory.network.fraction=0.01
taskmanager.memory.jvm-metaspace.size=128m
taskmanager.memory.framework.off-heap.size=128m
taskmanager.memory.jvm-overhead.fraction=0.1
taskmanager.memory.jvm-overhead.min=128m
上图的值由下往上解释:
1 、JVM overhead 1024*0.1=102.4 <128 所以JVM overhead = 128M
2、Jvm metaspace指定了jvm metaspace的参数为128,所以看到界面为128M
3、Network的64怎么来的呢,(1024-128-128)*0.01 = 7.68 < taskmanager.memory.network.min=64(默认值)
4、Task Off-heap 始终为0
5、Framework.off-heap 128 指定了具体参数 128。
6、Managed memory 7.68 指定了因子为0.01 (1024-128-128)*0.01 = 7.68。
7、Framework-heap 默认值为128,参数中没指定所以为128M。
所以task heap = 1024 - 128 -128 -64 - 0 - 128 - 7.68 -128 = 440.32