标签搜索
侧边栏壁纸
  • 累计撰写 18 篇文章
  • 累计收到 10 条评论

Flink内存模型

Arlen
2024-11-09 / 0 评论 / 33 阅读 / 正在检测是否收录...

Flink的内存分为堆外和堆内内存。
假设一个任务的TaskManager的任务配置了4G,内存模型如下图所示。其中托管内存(1.34G)和网络内存(343M)基本没用,那就可以把托管内存和网络内存设置为最小值64M,那就可以省出1340-64+343-64=1555M, 这部分内存就会加到堆内存上面去,此时堆内存的容量就变成了3G,而仅仅使用了1G,完全可以省出1-1.5G出来。
m39lgioe.png

堆内内存:

FreamworkHeap:框架使用的堆内存(默认固定128M)

TaskHeap:任务使用的堆内存

堆外内存:

ManagedMemory:托管内存,默认情况分配40%,但是不一定使用,是内存治理的重灾区。托管内存的用处有:

  • 批处理算法,比如排序,hashjoin等。
  • RocksDB StateBackend,Flink 只会预留一部分空间并扣除预算,但是不介入实际内存分配
  • PyFlink, 与 JNI 类似,在与 Python 进程交互的过程中,也会用到一部分托管内存。

Freamwork Off-Heap:框架使用的堆外内存,(默认固定128M)

DirectMemory:

  • 框架自身(taskmanager.memory.framework.off-heap.size 参数,默认 128M,例如 Sort-Merge Shuffle 算法所需的内存)
  • 用户任务(taskmanager.memory.task.off-heap.size 参数,默认设为 0)
  • Netty 对 Network Buffer 的网络传输(taskmanager.memory.network.fraction 等参数,默认 0.1 即 10% 的 Flink 总内存)。

JVM Metaspace:JVM Metaspace 主要保存了加载的类和方法的元数据,Flink 配置的参数是 taskmanager.memory.jvm-metaspace.size,默认大小为 256M,JVM 参数是 -XX:MaxMetaspaceSize.

JVM OverHead:JVM运行时开销,除了上述描述的内存区域外,JVM 自己还有一小块 “自留地”,用来存放线程栈、编译的代码缓存、JNI 调用的库所分配的内存等等,Flink 配置参数是 taskmanager.memory.jvm-overhead.fraction,默认是 JVM 总内存的 10%。

0

评论 (0)

取消