学习文档:
- 《Flink 官方文档 - 部署 - 内存配置 - 调优指南》
- 《Flink 官方文档 - 部署 - 内存配置 - 常见问题》
学习笔记如下:
调优指南
独立部署模式(Standalone Deployment)下的内存配置
- 通常无需配置进程总内存,因为不管是 Flink 还是部署环境都不会对 JVM 开销进行限制,它只与机器的物理资源相关。
- 建议配置 TaskManager 和 JobManager 的 Flink 总内存或其组成部分。
- 如果出现 Metaspace 不足的问题,可以调整 JVM Metaspace 的大小。
容器(Container Deployment)的内存配置
- 建议配置 TaskManager 和 JobManager 的进程总内存,该配置用于指定分配给 Flink JVM 进程的总内存,即需要申请的容器大小。
- 如果配置了 Flink 总内存,Flink 会自动加上 JVM 相关内存推算总内存,并根据总内存申请容器大小
- 如果 Flink 或用户代码分配超出容器大小的非托管的堆外内存(本地内存),部署环境可能会杀掉超用内存的容器,造成作业执行失败
State Backend 的内存配置
- 执行无状态作业或者使用 Heap State Backend 时,建议将托管内存设置为 0,从而最大化分配给 JVM 上用户代码的内存。
- 在使用 RocksDB State Backend 时,RocksDB 会使用本地内存,但默认情况下会限制其内存用量不超过用户配置的托管内存;因此,建议配置足够多的托管内存。如果关闭了 RocksDB 的内存管理,那么在容器化部署模式下如果 RocksDB 分配的内存超出了申请容器的大小(即进程总内存),则可能会造成 TaskExecutor 被部署环境杀掉。
批处理作业的内存配置
Flink 批处理算子使用托管内存来提高处理效率。当算子运行时,部分操作可以直接在原始数据上进行,而无需将数据反序列化成 Java 对象。因此,托管内存对应用性能有直接影响,Flink 会在不超过其配额限制的前提下,尽可能多地分配托管内存。
因为 Flink 明确知道可以使用的内存大小,所以当托管内存不足时,Flink 会将数据落盘,避免
OutOfMemoryError
发生。
常见问题
IllegalConfigurationException
报错原因:配置参数中存在无效值或配置冲突
解决方法:根据报错信息修改配置
OutOfMemoryError: Java heap space
报错原因:JVM 的堆空间过小
解决方法:可以通过增大总内存、TaskManager 的任务堆内存、JobManager 的 JVM 堆内存等方法来增大 JVM 堆空间
OutOfMemoryError: Direct buffer memory
报错原因:JVM 的直接内存限制过小,或者存在直接内存泄漏(Direct Memory Leak)
解决方法:
- 确认用户代码及外部依赖中是否使用了 JVM 直接内存,以及如果使用了直接内存,是否配置了足够的内存空间
- 可以通过调整堆外内存来增大直接内存限制
OutOfMemoryError: Metaspace
报错原因:JVM Metaspace 限制过小
解决方法:调整 TaskManager、JobManager 的 JVM Metaspace
IOException: Insufficient number of network buffers
报错原因:TaskManager 的网络内存过小。
解决方法:通过调整
taskmanager.memory.network.min
、
taskmanager.memory.network.max
、
taskmanager.memory.network.fraction
增大网络内存。
容器(Container)内存超用
如果 Flink 容器尝试分配超过其申请大小的内存(Yarn 或 Kubernetes),则通常说明 Flink 没有预留出足够的本地内存。 可以通过外部监控系统或者容器被部署环境杀掉时的错误信息判断是否存在容器内存超用。
对于 JobManager 进程,你还可以尝试启用 JVM 直接内存限制(
jobmanager.memory.enable-jvm-direct-memory-limit
),以排除 JVM 直接内存泄漏的可能性。
如果使用
RocksDbStateBackend
且未开启内存空值,则需要尝试增加 TaskManager 的托管内存。如果使用
RocksDbStateBackend
且开启了内存管理,但堆外内存在 savepoint 和 checkpoint 期间增长,则可能是由于 glibc memory allocator 的 Bug 导致,可以尝试给 TaskManager 增加环境变量
MALLOC_ARENA_MAX=1
。
此外,还可以尝试增大 JVM 开销。
版权归原作者 长行 所有, 如有侵权,请联系我们删除。