Flink内存配置调优指南

Flink内存模型(TaskManager)

image211b6afa16d8eb15.png

从上面的内存模型图可以看出内存结构:

  1. Flink使用了JVM Heap(堆内内存)和Off-Heap Memory(堆外内存);
  2. JVM Heap(堆内内存)包含Framework Heap(框架内存)和Task Heap(Task堆内内存);
  3. Off-Heap Memory(堆外内存)包含Managed Memory(管理内存)、Direct Memory(直接内存)和JVM特有内存(JVM Metaspace + JVM Overhead);
  4. Direct Memory(直接内存)包含Framework Memory(框架堆外内存)、Task Off-Heap(Task堆外内存)、Network(网络缓冲内存);
  5. JVM Metaspace(元空间)和JVM Overhead(JVM执行开销)在堆外内存中,不计入Flink内存(Total Flink Memory)中,但是包含在启动指令分配的内存中;JVM Metaspace(元空间)和JVM Overhead(JVM执行开销)属于JVM特有内存,由JVM本身占用;

内存大小

JVM特定内存

JVM本身使用的内存,包含JVM的Metaspace和Overhead

① JVM matespace:JVM元空间

taskmanager.memory.jvm-metaspace.size ,默认 256m

② JVM overhead:执行开销,JVM执行时自身所需要的内容,包括线程堆栈、IO、编译缓存等所使用的内存。

taskmanager.memory.jvm-overhead.fraction,默认 0.1

taskmanager.memory.jvm-overhead.min,默认 192m

taskmanager.memory.jvm-overhead.max,默认 1g

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

框架内存

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

堆内:taskmanager.memory.framework.heap.size,默认 128m

堆外:taskmanager.memory.framework.off-heap.size,默认 128m

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,默认 64m

taskmanager.memory.network.max,默认 1g

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

Flink内存 = 总进程内存 – JVM元空间 – JVM执行开销

托管内存

用于RocksDB State Backend 的本地内存和批的排序、哈希表、缓冲中间结果。

堆外:

taskmanager.memory.managed.fraction,默认 0.4

taskmanager.memory.managed.size,默认 none

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

案例分析

基于yarn模型,一般参数指定的是总进程内存,taskmanager.memory.process.size

比如指定为4G,每一块内存得到大小如下

1)计算Flink内存

JVM元空间256mb,默认固定

JVM执行开销:4g*0.1=409.6m,在[192m,1g]之间,最终结果为409.6m

Flink内存 = 4g – 256m – 409.6m = 3430.4m

2)框架内存,堆内堆外都是128m

3)网络内存 = 3430.4m * 0.1 = 343.04m,在[64m,1g]之间,最终结果为343.04m

4)托管内存 = 3430.4m * 0.4 = 1372.16m

5)Task堆内内存 = Flink内存 – 框架堆内内存 – 框架堆外内存 – 网络内存 – 托管内存

所以,本例中Task堆内内存 = 3430.4m – 128m – 128m – 343.04m – 1372.14m = 1459.2m

image4f84ee35a97125fa.png

进程内存给多大,需不需要调整,需要具体情况具体分析,在实际项目中,观察Metric中各部分内存使用率,小的调大,大的调小,找到一个平衡点。同时,内存分配需要留足余量。

————————————————
版权声明:本文为CSDN博主「Johnson8702」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Johnson8702/article/details/123180708

0 0 投票数
文章评分

本文转载自Johnson8702,原文链接:https://blog.csdn.net/Johnson8702/article/details/123180708?utm_source=app&app_version=5.3.0&code=app_1562916241&uLinkId=usr1mkqgl919blen。

(0)
上一篇 2022-04-05 14:26
下一篇 2022-04-05 18:16

相关推荐

订阅评论
提醒
guest

0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x