flink_book/调优/Resource.md
2022-12-31 22:35:03 +08:00

3.0 KiB
Raw Blame History

内存设置

TaskManager 内存模型

TaskManager的内存模型如下图所示(1.10之后版本内存模型)

pic

Flink使用了堆上内存和堆外内存。

  • Flink 框架内存使用了堆外内存和堆外内存不计入slot资源。
  • Task执行的内存使用了堆上内存和堆外内存。
  • 网络缓冲内存:网络数据交换所使用的内存大小,如网络数据交换缓冲区。

框架堆外内存、Task堆外内存、网络缓冲内存都在堆外的直接内存里面。

  • 管理内存Flink堆外内存的管理用于管理排序hash表缓冲中间结果以及RocksDb 状态后端的本地内存。
  • JVM特有内存JVM本身占用的内存包括元数据和执行开销

Flink 使用内存 = 框架堆内和堆外内存 + Task堆内和堆外内存 + 网络缓冲内存 + 管理内存。

进程内存 - Flink 内存 + JVM特有内存

JVM特有内存详解

JVM特定内存 JVM本身使用的内存包含JVM的metaspace和over-head

  • JVM的metaspaceJVM 元空间。taskmanager.memory.jvm-meta-space.size默认为256mb。
  • JVM over-head执行开销JVM 执行时自身所需要的内容包括线程堆栈、IO、编译内存等所使用的内存。 taskmanager.memory.jvm-overhead.fraction, 默认0.1
    taskmanager.memory.jvm-overhead.min默认192mb
    taskmanager.memory.jvm-overhead.max默认1gb

总进程内存*fraction,如果小于配置的min或者大于配置的max大小则使用min/max

框架内存

Flink框架即TaskManager本身占用的内存不计入Slot的资源中。

堆内:taskmanager.memory.framework.heap.size 默认128mb。

堆外:taskmanager.memory.framework.off-heap.size默认128mb。

Task内存

Task执行用户代码所使用的内存。

堆内:taskmanager.memory,task,heap.size默认none由Flink内存扣除掉其他部分内存得到。

堆外:taskmanager.memory,task.off-heap.size默认为0表示不适用堆外内存。

网络内存

网络数据交换所使用的堆外内存大小,如网络数据交换缓冲区。

堆外:taskmanager.memory.network.fraction默认0.1。

taskmanager.memory.network.min默认为64mb。

taskmanager.memory.network.max默认为1gb。

Flink内存*fraction,如果小于配置的min或者大于配置的max大小则使用min/max

托管内存

用于RocksDB 状态后端的本地内存和批的排序、hash、缓冲中间结果。

堆外: taskmanager.memory.managed.fraction,默认0.4。

taskmanager.memory.managed.size 默认为none。

如果size没指定则等于Flink内存 * fraction 。

查看TaskManager内存图如下所示如果内存长时间占用比例过高就需要调整Flink作业内存了。

pic

  • 如果未使用RocksDB作为状态后端则可以将管理内存调整为0.
  • 单个TaskManager内存大小为2-8G之间。

合理CPU设置

并行度设置