flink运行时内存管理解读

概述

这张图大家都很熟悉,往往解释确很困难,运行时的内存调优是建立再理解的基础上。下面将其分成五大类一一与大家分享我的理解:


运行时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)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容