flink-taskmanager内存计算
自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位小数点,内存与上述表格中一致。
更多推荐



所有评论(0)