概述
这张图大家都很熟悉,往往解释确很困难,运行时的内存调优是建立再理解的基础上。下面将其分成五大类一一与大家分享我的理解:
运行时webui中截取
图二左边的图实际是和右边图一直,右边只是把各个内存细小分类了。
整理后的分类
第一类:framework xx memory与 task xx memory区别
主要区别:是否计入slot资源
每个slot都具有单独的task资源,所有的slot共享一份framework资源
所有slot资源之和 + framework = taskExecutor的资源。
目前slot是平分taskexector资源(除去framwork的资源公共占用)
图3 slot内存占用
第二类:xx heap memory与 xx off-heap memory区别
1、Heap
类比java中JVM的堆内存,Flink中是单独管理的并不等于JVM。
- 存绝大多数的Java对象
- HeapStateBackend ,在straming流式处理中,状态都是存在heap中
2、Off-Heap
类比不受JVM管控的使用内存
- Direct 直接
DirectByteBuffer、MappedByteBuffer - Native 本地
例如:C/C++、Python、etc、JNI等
到这里相信能理解的名词包含
- framework heap memory
- task heap memory
- framework off-heap memory
- task off-heap memory
第三类:network memory
本质用的是direct memory
其主要作用:用于数据传输缓冲
主要特点:
- 同一taskExecuctor的各slot之间没有隔离
- 需要多少由作业的拓扑决定,不足则导致运行失败
第四类:managed memory
本质用的是native memory
其主要作用:
- 用于RocksDBStateBackend状态后端,因为RocksDB是用C++编写的。
- Batch Operator ,Checkpoint
优化点;当作业中使用heapStateBackend或者 无状态时,其实是不需要managed memory,可以将其设置为0,以避免资源浪费。
主要特点:
- 同一taskExecuctor的各slot之间严格隔离
- 多点少点都能跑,与性能挂钩
第五类:JVM Metaspace 与 JVM Overhead
JVM Metaspace
其主要作用:
- 存放JVM今安在类的元数据
- 加载的类越多,需要的空间越大
调优
一下情况需要注意调大JVM Metaspace
1、作业需要加载大量的第三方库
2、多个不同作业的任务运行在同一个TaskExecutor上
JVM Overhead
属于 Native memory
主要用于:
- 用于其他JVM开销
- 例如 code cache、Thread stack
对于以上名词理解不了建议先看这篇文章 flink内存特性及报错分析 - 简书 (jianshu.com)