赞
踩
自flink1.10以后flink重构了taskmanager内存模型,如下图:
其中ProcessMemory=(FlinkMemory+Metaspace+Overhead)
FlinkMemory=(JVMHeap+ManagedMemory+DirectMemory)
JVMHeap=FrameHeap+TaskHeap
DirectMemory=(FramewokOffHeap+TaskOffHeap+Network)
上述内存对应jvm参数:
DirectMemory -> -XX:MaxDirectMemorySize
JVMHeap -> -Xms/-Xmx
Metaspace -> -XX:MaxMetaspaceSize
假设运行时候有如下参数:
- -Dtaskmanager.numberOfTaskSlots=2 \
- -Dtaskmanager.memory.process.size=12g \
- -Dtaskmanager.memory.managed.fraction=0.5 \
- -Dtaskmanager.memory.jvm-overhead.fraction=0.4 \
由于我配置了memory.process.size则flink计算内存时候会通过ProcessMemoryUtils#deriveProcessSpecWithTotalProcessMemory这个方法进行内存计算,时序图如下:
咱们按照这个方法来计算下各个区域的内存大小:
区域 | 大小 | 备注 |
TotalProcessMemory | 12288m(12g) | 向yarn/k8s申请的进程可以使用的最大内存 |
MetaspaceMemory | 256m(0.25g) | 默认值 |
OverheadMemory | 1024m(1g) | 计算规则TotalProcessMemory*jvm-overhead.fraction=4.8gb 但是因为jvm-overhead.max是1gb,所以就取1gb |
TotalFlinkMemory | 11008m(10.75g) | 12288-1024-256 |
ManagedMemory | 5504m(5.375g) | TotalFlinkMemory*managed.fraction |
NetworkMemory | 1024m(1g) | TotalFlinkMemory*network.fraction=11008*0.1=1100.8mb 但是因为taskmanager.memory.network.max为1gb所以就是1gb |
frameworkOffHeapMemory | 128m(0.125gb) | 默认值 |
taskOffHeapMemory | 128m(0.125gb) | 默认值 |
HeapMemory | 4224m(4.125gb) | TotalFlinkMemory-ManagedMemory-NetworkMemory-frameworkOffHeapMemory-taskOffHeapMemory |
下图是flink-ui界面的内存分配
该界面中四舍五入保留2位小数点,内存与上述表格中一致。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。