内存配置优化
Flink 内存模型
内存模型详解
进程内存(Total Process Memory):Flink 进程内存分为堆上内存和堆外内存,堆上内存和
堆外内存的主要区别在于它们的管理方式不同和使用方式不同,这些会影响到它们的性能和使用场景。
(1)JVM Heap(堆上内存):由 JVM 进行管理和分配的内存空间,可以快速的分配和释放内存,具有更好的内存管理和垃圾回收机制(JVM 垃圾回收机制)。
(2)OFF-Heap Memory(堆外内存):由操作系统进行管理和分配的内存空间,能够存储更大的数据和缓存,提供更好的性能和扩展性,堆外内存的使用的管理是要手动编码实现,相对于堆上内存更加复杂和容易出错。
JVM 内存: JVM 内存包括 JVM Mataspace(JVM 元空间)和 JVM OverHead(JVM 执行开销)
(1)JVM Mataspace(JVM 元空间):用于存放 class 文件中的类和方法等信息。
(2)JVM OverHead(JVM 执行开销):JVM 执行时自身所需要的内容,包括线程堆栈、IO、编译缓存等所使用的内存。
框架内存:框架内存即 TaskManager 本身占用的内存,包括 Framework Heap(框架堆上
内存)和 Framework Off-Heap(框架堆外内存),不计入 slot 资源。
网络内存:NetWork(网络内存)即网络数据交换所使用的堆外内存大小,如网络数据交换缓冲区。
托管内存:Managed Memory(托管内存)用于 Flink 中状态的缓存存储。
Task 内存:Task 内存分为 Task Heap(Task 堆上内存)和 Task Off-Heap(Task 堆外内存),这部分内存用于执行用户代码。
内存配置详解
JVM Mataspace(JVM 元空间):
JVM OverHead(JVM 执行开销):
JVM 执行开销计算方式:
执行开销 = 进程内存 * fraction。此计算结果必须落在[192m, 1g]区间内,超过此区间则取边界值。
框架内存:
Managed Memory(托管内存):
如果 taskmanager.memory.managed.size 未指定则使用总进程大小 * fraction。
NetWork(网络内存):
计算方式和 jvm 执行开销一样。
Task 内存:
Task 堆上内存为 none,为 Flink 内存扣除掉其他内存所得。
内存配置所做优化
优化前:
存在的问题:
1)进程总内存设置为 16g,但是 Task 所分得的堆内存只占 2 分之 1,容易造成频繁 GC,影响性能,甚至出现 OOM。
2)除了 Task 内存其他内存利用率不高,浪费资源,主要使用的就是 Task 内存资源。
优化后:
优化参数(根据需求自行配置,根据内存使用率来调整):
taskmanager.memory.managed.size: 128m
taskmanager.memory.jvm-metaspace.size: 512m
taskmanager.memory.network.max: 256m
taskmanager.memory.jvm-overhead.max: 512m