当前位置:   article > 正文

flink 调优指南_flink默认堆内和堆外内存的比例

flink默认堆内和堆外内存的比例

本文主要介绍一些flink内存模型、参数配置、性能监控相关知识,直接先上一个思维导图。
在这里插入图片描述

Flink 性能调优的第一步,就是为任务分配合适的资源,在一定范围内,增加资源的分配与性能的提升是成正比的,实现了最优的资源配置后,在此基础上再考虑进行后面论述的性能调优策略。

一、资源配置调优

内存模型详解

https://ci.apache.org/projects/flink/flink-docs-release-1.12/fig/detailed-mem-model.svg

1. JVM 特定内存

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

  • JVM metaspace:JVM 元空间

      taskmanager.memory.jvm-metaspace.size,默认 256mb
    
    • 1

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

  • taskmanager.memory.jvm-overhead.fraction,默认 0.1
    
    taskmanager.memory.jvm-overhead.min,默认 192mb
    
    taskmanager.memory.jvm-overhead.max,默认 1gb
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

2. 框架内存

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

  • 堆内:taskmanager.memory.framework.heap.size,默认 128MB
  • 堆外:taskmanager.memory.framework.off-heap.size,默认 128MB
3. Task 内存

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

  • 堆内:taskmanager.memory.task.heap.size,默认 none,由 Flink 内存扣除掉其他部分的内存得到。
  • 堆外:taskmanager.memory.task.off-heap.size,默认 0,表示不使用堆外内存
4. 网络内存

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

堆外:

  • taskmanager.memory.network.fraction,默认 0.1
    
    taskmanager.memory.network.min,默认 64mb
    
    taskmanager.memory.network.max,默认 1gb
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

5. 托管内存

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

堆外:

  • taskmanager.memory.managed.fraction,默认 0.4
    
     taskmanager.memory.managed.size,默认 none
    
    • 1
    • 2
    • 3

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

案例分析

基于Yarn模式,一般参数指定的是总进程内存,taskmanager.memory.process.size,比如指定为 4G,每一块内存得到大小如下:

1. 计算 Flink 内存
  • JVM 元空间 256m

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

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

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

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

    框架内存,堆内和堆外都是 128m

    Task 堆内内存=3430.4m-128m-128m-343.04m-1372.16m=1459.2m

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PXX9GDzF-1650183533215)(/Users/sanhongbo/Library/Application Support/typora-user-images/image-20220417160659141.png)]

所以进程内存给多大,每一部分内存需不需要调整,可以看内存的使用率来调整。(在监控上图页面时看各部分内存占用情况,设置一个合理的值)

二、并行度设置

这里不过多介绍,上下游都是kafka时,一般保证source端和sink端的并行度和kafka分区数保持一致。以source为例,kafka分区为6,source并行度为4,那么有两个并行度会处理2个kafka分区的数据,造成数据倾斜;kafka分区为4,source并行度为6,有两个并行度得不到数据,会导致watermark不会更新。

本文持续更新中。。。。。。。。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/919076
推荐阅读
相关标签
  

闽ICP备14008679号