Flink TM内存详解
碰到说是DriectMemory内存超了,直接调task.off-heap.size,其他不需要调整,除非确认是framwork的问题,network不会把问题暴露在这个阶段。如果我们很依赖RocksDB进行状态数据存储,想要提高RocksDB的性能,就可以调大 fraction。Java 的 Overhead 就是给 TM 预留的内存,防⽌ Container 超内存被 yarn 或 K8s k
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 直接调大内存 |
更多推荐
所有评论(0)