TaskExecutor内存模型原理深入
TaskManager内存配置
内存配置
配置概览
严格和非严格配置
不建议
total process
、total flink
、task Heap&Managed
同时配置两项以上,因为子项和总内存都配置的话会因为严格匹配的原因导致冲突,所以其中至少有一项配置。
配置参数描述
内存模型
Flink JVM 进程的*进程总内存(Total Process Memory)*包含了由 Flink 应用使用的内存(Flink 总内存)以及由运行 Flink 的 JVM 使用的内存。 Flink 总内存(Total Flink Memory)包括 JVM 堆内存(Heap Memory)和堆外内存(Off-Heap Memory)。 其中堆外内存包括直接内存(Direct Memory)和本地内存(Native Memory)。
内存分块图
Frameworks和Task 的区别
区别:是否计入Slot资源
总用量限制
-Xmx=FrameworkHeap+Task Heap
-Xx:MaxDiectMemorySize=...+Framework Off-heap+Task Off-Heap
Slot和Framwork的内存无隔离
Heap和Off-Heap Memory
Heap
大多数Java对象
HeapStateBackend存储的State
Off-Heap
Direct
DirectbyteBuffer
MappedByteBuffer
Native
JNI,C/C++,Python,etc
NetWork Memory
Direct Memory
用于数据传输缓冲
特点
同一个taskExecutor的各slot之间没有隔离
需要多少由作业拓扑决定,不足会导致运行失败
Task的网络内存计算
Managed Memory
Native Memory
用于:RocksDBStateBackend、Batch Operator、HeapStateBackend/无状态不需要Managed Meory可以设置为0
特点
统一个TaskExecutor的各个slot之间严格隔离
与性能挂钩
RocksDB内存限制
state.backend.rocksdb.memory.managed(default:true)
设置RocksDB使用内存大小为Managed Memory大小
目的:防止容器内存超用
JVM Metaspace& Overhead
Metaspace
存放JVM加载的类的元数据
加载的类越多,需要的空间越大
需要调大Metaspace的情况
Metaspace OOM问题
需要加载大量的第三方内库
多个不同作业的任务运行在同一个TaskExecutor上
JVM Overhead
Native Memory
用于其他JVM开销
Code Cache
Thread Stack
内存特性
###Java内存类型
Heap和OffHeap
底层又分为Young和Old区域
Heap Memory特性
包括:
Framework Heap Memory
和Task heap Memory
用量上限受于JVM控制
-Xmx:Framework Heap+Task heap
达到上限后触发GC
GC后仍然空间不足,触发OOM异常并退出
Direct Memory&Metaspace特性
Direct Meory
包括Framework和Task的Off-Heap以及Netowrk memory
用量受-XX:MaxDirectMemorySize限制
达到上限时触发GC,GC后仍然空间不足触发OOM异常并退出
Metaspace
受限制与-XX:MetaspaceSize
Native Memory特性
Framework Off-Heap Memory(部分)
Task Off-Heap Memory(部分)
Managed Memory
JVM Overhead
用量上限不受JVM控制
JobManager内存
参数配置
配置总内存
jobmanager.memory.flink.size
jobmanager.memory.process.size
详细配置
内存特性
堆内内存
以下会用到堆内内存
用于Flink框架
在作业提交时(例如一些特殊的批处理 Source)及 Checkpoint 完成的回调函数中执行的用户代码
需要多少堆内内存取决于运行的作业数量、作业的结构及上述用户代码需求。
堆外内存
堆外内存包括 JVM 直接内存 和 本地内存。 可以通过配置参数
jobmanager.memory.enable-jvm-direct-memory-limit
设置是否启用 JVM 直接内存限制。 如果该配置项设置为true
,Flink 会根据配置的堆外内存大小设置 JVM 参数 -XX:MaxDirectMemorySize。可以通过配置参数
jobmanager.memory.off-heap.size
设置堆外内存的大小。 如果遇到 JobManager 进程抛出 “OutOfMemoryError: Direct buffer memory” 的异常,可以尝试调大这项配置。以下情况可能用到堆外内存:
Flink 框架依赖(例如 Akka 的网络通信)
在作业提交时(例如一些特殊的批处理 Source)及 Checkpoint 完成的回调函数中执行的用户代码
工具
bash-java-utils.jar
Flink目录bin下的bash-java-utils.jar
https://github.com/KarmaGYZ/flink-memory-calculator
最后更新于