Flink v1.14 AT_LEAST_ONCE checkpoint模式下托管内存占100%问题咨询
Flink 1.14 原生K8S部署下AT_LEAST_ONCE模式托管内存占满问题解答
现象定性
该场景下托管内存占用率始终100%的情况,绝大多数场景下属于Flink内存管理的预期正常行为,并非内存泄漏或者资源配置不足导致的异常。
核心成因
- 托管内存预分配机制:Flink TaskManager启动时会按照
taskmanager.memory.managed.size配置或者预设比例,将托管内存整块预占,形成独立的内存池。监控统计的占用率是内存池内已分配给业务组件的内存占池总大小的比例,不是操作系统层面的进程内存溢出。 - 状态后端的内存使用逻辑:如果使用的是流处理作业默认推荐的RocksDB状态后端,RocksDB的内存会完全纳入托管内存池管理。RocksDB本身的设计逻辑就是尽可能多用分配给它的内存缓存热点状态数据,减少磁盘IO开销,因此会把全部托管内存用满。
- AT_LEAST_ONCE模式的特性:AT_LEAST_ONCE模式下checkpoint不需要做barrier对齐,算子的数据处理吞吐量更高,状态访问、写入的频率也更高,会更快把托管内存池的空闲块消耗完,最终稳定在100%占用。
- 若使用Heap状态后端,且作业没有用到窗口排序、双流Join等需要消耗托管内存的算子时出现该现象,才需要检查
taskmanager.memory.managed.fraction等配置是否设置过高,或者是否有第三方组件违规占用托管内存。
异常排查触发条件
只有出现以下现象时,才需要调整托管内存配置:
- 作业日志抛出
OutOfMemoryError: Managed memory exhausted类报错 - Checkpoint持续超时失败,且日志存在RocksDB写阻塞、内存不足相关报错
- 作业频繁触发Full GC,进程实际内存占用超出配置的TaskManager总内存上限

内容的提问来源于stack exchange,提问作者周天钜
相关产品推荐
相关产品推荐

