Flink TM内存详解

JAVA Heap

java堆内存

framwork heap

Flink 框架堆内

taskmanager.memory.framework.heap.size

框架使用堆内存

默认:128MB

framework.heap.size + task.heap.size 就是 Flink 堆内存的⼤⼩

TM 启动时,会通过传递 JVM 参数 -Xmx628M -Xms628M 来指定 TM 的堆内存为 628M

何时调解堆内存,出现一下:

1 Java.lang.OutOfMemoryError:Java heap space

2 Java.lang.OutOfMemeoryError:GC overhead limit exceeded

程序在垃圾回收上花了很多时间,却手机一点点内存,伴随着会出现CPU的升高。

需要关注线上代码是否存在对象没有释放的可能。

使用命令:

命令:jmap -histo:live pid

这个命令会进行一次 full gc,然后输出各种对象占用的内存空间。如果去掉 live 表示不进行 full gc,直接输出对象占用的内存空间。

3 GC严重

量化标准:

一分钟YGC时间只有及时MS,算是分成不频繁,5S以下算是正常,超过5S算GC频繁

如何调大/小参数:

1 调大TM总内存,task.heap.siz随之升高

2 降低network,managed,overhead的占比

task heap

Task 堆内

taskmanager.memory.task.heap.size

用户开发的代码使用堆内存

默认不配置

off_heap memory

堆外内存

managed memory

Flink管理内存

 

使用场景:

1 SQL,Scala,Java开发的流场景下RocksDB申请的内存

2 Batch场景sort,cache,中间结果会使用到

3 Python的UDF

flink参数:

taskmanager.memory.managed.fraction

默认0.4

计算方式:flink.size*fraction

taskmanager.memory.managed.size

默认没有这个配置,设置的话fraction会失效

什么时候调大?

如果我们很依赖RocksDB进行状态数据存储,想要提高RocksDB的性能,就可以调大 fraction。默认0.4就很大,线上运行中随时观察进行调整。

什么时候调小?

1 使用RocksDB但状态数据较小

2 使用FsStateBackend,状态数据存储在堆内存中,应该调小

注意:

Flink不能严格控制RocksDB内存的使用,可能会超。

direct memory

framwork 0ff-head

Flink 框架堆外

taskmanager.memory.framework.off-heap.size

默认128MB

java.lang.OutOfMemoryError: Direct buffer memory

碰到说是DriectMemory内存超了,直接调task.off-heap.size,其他不需要调整,除非确认是framwork的问题,network不会把问题暴露在这个阶段。

task off-head

Task 堆外

taskmanager.memory.task.off-heap.size

默认0MB

network

taskmanager.memory.network.min

默认64MB

taskmanager.memory.network.max

默认1GB

taskmanager.memory.network.fraction

默认0.1

什么场景需要用到network

keyby,rebalance比较多且并行度较高的场景对network使用较多

任务并行度低且多为chain在一起时,对network使用较低

调大network:

network特点用多少申请多少,如果不够任务启动失败并报错。

永远不会因为network出现OOM

java.io.IOException: Insufficient number of network buffers

调小:

看TM页面,使用很小就可以调,直接调fraction

JVM sprcific memory

JVM metaspace

flink参数:

taskmanager.memory.jvm-metaspace.size

表示 Java 元空间占⽤的内存空间,默认⼤⼩ 256MB

Java 的元空间主要⽤于存储类的信息、常量池、⽅法数据、⽅法代码等

通过 JVM 参数:-XX:MaxMetaspaceSize

Flink一般给的内存是256MB是够用的,除非出现:

Java.lang.OutOfMemeoryError:Metaspace

解决方案:

慢慢提升大小,直到不报错为止。

JVM Overhead

Java 的 Overhead 就是给 TM 预留的内存,防⽌ Container 超内存被 yarn 或 K8s kill

参数:

taskmanager.memory.jvm-overhead.fraction

默认0.1

taskmanager.memory.jvm-overhead.max

默认1GB

taskmanager.memory.jvm-overhead.min

默认192MB

Container 超内存被 Kill

直接调大内存

cf6aa425217a464cae06a33d42a44574.png

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐