【Flink】Taskmanager 内存管理

Flink Taskmanager 的内存划分和调整策略。

整个内存模型物理上分为 JVM HeapOff-Heap 两部分,逻辑上可以分为 Total Process MemoryTotal 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 (堆内存)
  1. Framework Heap Memory
    Flink 框架运行所需要使用的内存,配置项为 taskmanager.memory.framework.heap.size,默认值为 128 MB,一般不建议修改。
  2. Task Heap Memory
    Flink 任务算子和用户代码运行使用的内存,配置项为taskmanager.memory.task.heap.size,默认值为 Total Flink Memory 减去 Framework Heap Memory, Framework Off-Heap Memory, Task Off-Heap Memory, Managed MemoryNetwork Memory
Off-Heap(非堆内存)
  1. Managed memory
    由 Flink 内存管理器管理的非堆内存,主要用于:

    • 内置算法:排序、哈希表、缓存中间结果
    • RocksDB state backend。
    • Python UDFs

    配置项为 taskmanager.memory.managed.sizetaskmanager.memory.managed.fraction。默认为 Total Flink Memory 的 40%。

    对于不使用三种功能的场景,可以把 taskmanager.memory.managed.fraction 设置为 0,来增大用户代码能使用的内存。

  2. Framework Off-Heap Memory
    Flink 框架运行所需要使用的非堆内存,配置项为 taskmanager.memory.framework.off-heap.size,默认值为 128 MB,不建议修改。

  3. Task Off-Heap Memory
    Flink 任务算子和用户代码运行使用的非堆内存,配置项为 taskmanager.memory.task.off-heap.size,默认值为 0,如果用户代码里有用到非堆内存的情况,需要手动设置。

  4. Network Memory
    TaskManager 之间传输数据用到的直接内存,比如网络缓存,配置项为 taskmanager.memory.network.min taskmanager.memory.network.max taskmanager.memory.network.fraction,网络缓存调优相关指南。默认值为 Total Flink Memory 的 10%,最大不默认没有上限,最小默认 64MB。

  5. JVM MetaspaceJVM 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/