博客
关于我
详解 Flink 容器化环境下的 OOM Killed
阅读量:113 次
发布时间:2019-02-26

本文共 1704 字,大约阅读时间需要 5 分钟。

Flink 内存管理与OOM问题分析

JVM 内存模型解析

在Flink的YARN部署环境中,JVM的内存管理是确保应用稳定运行的关键因素。JVM的内存分区与容器化环境的兼容性较差,容易导致内存溢出问题。本文将从JVM的内存模型入手,分析其内存分区及其对Flink性能的影响。

JVM内存分区详解

JVM 8的内存模型根据Java虚拟机规范可以细分为以下几个区域:

  • Heap:由GC管理,主要存放对象实例。
  • Metaspace:存储类的元数据,包括字段和方法签名。
  • Thread:线程级别内存,包括操作数栈和寄存器。
  • Code Cache:JIT编译器生成代码的缓存。
  • Class Cache:存储类验证相关信息。
  • GC:垃圾回收器内部使用的内存。
  • Symbol:存储符号(如字段名、方法签名)。
  • Arena Chunk:JVM申请操作系统内存的临时缓存区。
  • NMT:JVM本身使用的内存。
  • Internal:未被其他分类的内存区域。
  • 在实际应用中,用户通常只需要对Heap和Metaspace设置硬性限制,而其他区域可以作为JVM自身内存的一部分进行管理。

    Flink 1.10+版本对内存管理进行了重构,引入了新的内存参数以应对复杂的内存管理需求。Flink的内存模型主要包含以下几个部分:

  • JVM内存:包括Heap、Metaspace等标准区域。
  • Off-Heap内存:Flink专用的非JVM内存区域。
  • Native Non-Direct内存:用于JNI调用和第三方库的内存申请。
  • Flink内存管理策略

    Flink对Off-Heap内存采取三种管理策略:

  • 硬限制(Hard Limit):确保内存不会超过预设阈值。
  • 软限制(Soft Limit):允许短期内超标,但长期保持在阈值以下。
  • 预留(Reserved):在规划内存时预留部分空间,但不进行严格限制。
  • JVM Overhead的内存管理

    JVM Overhead是指JVM本身使用的非Self-Contained内存区域。这种内存区域通常难以准确控制,因此容易引发内存溢出问题。以下是JVM Overhead的常见问题及解决方法:

    常见OOM问题及解决方案

    RocksDB Native内存不确定性

    RocksDB通过JNI直接申请Native内存,其内存占用包含以下几个部分:

  • Block Cache:存储未压缩的数据块。
  • Indexes and filter blocks:优化读性能。
  • Memtable:类似写缓存。
  • Iterator-pinned Blocks:遍历操作时阻止Block释放。
  • Flink在计算RocksDB内存时未充分考虑Iterator-pinned Blocks的内存占用,导致内存预留不准确。解决方法是通过调大JVM Overhead的阈值,为RocksDB预留更多内存,缓解短期内存超标问题。

    glibc Thread Arena问题

    glibc的Arena内存管理机制可能导致进程内存急剧增长,最终导致OOM。具体表现为进程pmap中出现大量64MB的anon段。

    解决方法包括:

  • 调整MALLOC_ARENA_MAX环境变量,限制Arena总数。
  • 替换glibc内存管理库为jemalloc或tcmalloc。
  • JDK8 Native内存泄漏

    Oracle JDK8u152版本前存在一个Native内存泄漏问题,导致MemberNameTable内存持续增长。解决方法是升级JDK版本到8u152及以上。

    YARN mmap内存计算问题

    YARN通过/proc/${pid}/status计算进程内存,存在对mmap内存的不准确计算。解决方法是开启基于smaps的内存计算选项,减少误报。

    总结

    Flink在YARN环境下的内存管理问题主要由JVM Overhead和Native内存泄漏引起。通过合理配置JVM参数、优化内存管理策略,可以有效减少OOM问题。本文从JVM内存模型、Flink内存管理策略以及常见问题入手,为用户提供了实用且详尽的解决方案。

    转载地址:http://cazy.baihongyu.com/

    你可能感兴趣的文章
    Objective-C享元模式(Flyweight)
    查看>>
    Objective-C以递归的方式实现二叉搜索树算法(附完整源码)
    查看>>
    Objective-C内存管理教程和原理剖析(三)
    查看>>
    Objective-C实现 Greedy Best First Search最佳优先搜索算法(附完整源码)
    查看>>
    Objective-C实现 jugglerSequence杂耍者序列算法 (附完整源码)
    查看>>
    Objective-C实现1000 位斐波那契数算法(附完整源码)
    查看>>
    Objective-C实现2 个数字之间的算术几何平均值算法(附完整源码)
    查看>>
    Objective-C实现2d 表面渲染 3d 点算法(附完整源码)
    查看>>
    Objective-C实现2D变换算法(附完整源码)
    查看>>
    Objective-C实现3n+1猜想(附完整源码)
    查看>>
    Objective-C实现3n+1猜想(附完整源码)
    查看>>
    Objective-C实现9x9乘法表算法(附完整源码)
    查看>>
    Objective-C实现9×9二维数组数独算法(附完整源码)
    查看>>
    Objective-C实现A*(A-Star)算法(附完整源码)
    查看>>
    Objective-C实现A-Star算法(附完整源码)
    查看>>
    Objective-C实现abbreviation缩写算法(附完整源码)
    查看>>
    Objective-C实现ABC人工蜂群算法(附完整源码)
    查看>>
    Objective-C实现activity selection活动选择问题算法(附完整源码)
    查看>>
    Objective-C实现AC算法(Aho-Corasick) 算法(附完整源码)
    查看>>
    Objective-C实现adaboost算法(附完整源码)
    查看>>