【Flink】Taskmanager 内存管理
Flink Taskmanager 的内存划分和调整策略。
Flink Taskmanager 内存模型
整个内存模型物理上分为 JVM Heap 和 Off-Heap 两部分,逻辑上可以分为 Total Process Memory 和 Total Flink Memory 两部分。
Total Process Memory 为整个 Flink JVM 进程使用的全部内存
Total Process Memory = Total Flink Memory + JVM Metaspace + JVM Overhead
配置项为 taskmanager.memory.flink.size 和 taskmanager.memory.process.size,两个选项配置任意一个即可。对于 Kubernetes session mode 部署,在启动 session 时使用 taskmanager.memory.process.size 配置。
JVM Heap (堆内存)
- Framework Heap Memory
Flink 框架运行所需要使用的内存,配置项为 taskmanager.memory.framework.heap.size,默认值为 128 MB,一般不建议修改。 - Task Heap Memory
Flink 任务算子和用户代码运行使用的内存,配置项为taskmanager.memory.task.heap.size,默认值为 Total Flink Memory 减去 Framework Heap Memory, Framework Off-Heap Memory, Task Off-Heap Memory, Managed Memory 和 Network Memory
Off-Heap(非堆内存)
-
Managed memory
由 Flink 内存管理器管理的非堆内存,主要用于:- 内置算法:排序、哈希表、缓存中间结果
- RocksDB state backend。
- Python UDFs
配置项为 taskmanager.memory.managed.size 和 taskmanager.memory.managed.fraction。默认为 Total Flink Memory 的 40%。
对于不使用三种功能的场景,可以把 taskmanager.memory.managed.fraction 设置为 0,来增大用户代码能使用的内存。
-
Framework Off-Heap Memory
Flink 框架运行所需要使用的非堆内存,配置项为 taskmanager.memory.framework.off-heap.size,默认值为 128 MB,不建议修改。 -
Task Off-Heap Memory
Flink 任务算子和用户代码运行使用的非堆内存,配置项为 taskmanager.memory.task.off-heap.size,默认值为 0,如果用户代码里有用到非堆内存的情况,需要手动设置。 -
Network Memory
TaskManager 之间传输数据用到的直接内存,比如网络缓存,配置项为 taskmanager.memory.network.min taskmanager.memory.network.max taskmanager.memory.network.fraction,网络缓存调优相关指南。默认值为 Total Flink Memory 的 10%,最大不默认没有上限,最小默认 64MB。 -
JVM Metaspace 和 JVM Overhead
JVM Metaspace 和 JVM Overhead 的内存,配置项为 taskmanager.memory.jvm-metaspace.size taskmanager.memory.jvm-overhead.fraction 等。其中 Overhead 默认为 Total Process Memory 的 10%,最大默认不超过 1024MB,最小默认大于 192MB;Metaspace 默认为 256MB。
On Kubernetes Cluster 具体配置
如果按如下配置
# taskmanager 向 k8s 申请的总内存大小
taskmanager.memory.process.size: 8192m
# taskmanager.memory.managed.fraction 设为 0,增大用户代码能使用的内存
taskmanager.memory.managed.fraction: 0
最后分配结果就是:
- Framework Heap Memory 128MB
- Managed Memory 0MB
- Framework Off-Heap Memory 128MB
- Task Off-Heap Memory 0MB
- Network Memory (8192MB - 256MB - 819MB) * 0.1 = 712 MB
- JVM Metaspace 256MB
- JVM Overhead 8192MB * 0.1 = 819MB
- Task Heap Memory 8192MB - 128MB - 128MB - 0MB - 819MB - 256MB - 712MB = 6149MB
参考
https://nightlies.apache.org/flink/flink-docs-release-1.20/docs/deployment/memory/mem_setup_tm/