前言
生产上线一个任务,稳定运行中,突然,挂了。查看报错为oom了,本着内存不够那就加资源的原则(本人代码并无明显问题,哈哈哈),那就给tm的内存多一点就完事了。
最开始给的资源参数在提交命令中是这样的
-Djobmanager.memory.process.size=800mb
-Dtaskmanager.memory.process.size=2048mb
其中,tm的执行内存给了2g,我觉得怎么也够用了,结果发现还是oom了。可能确实程序处理的数据量有点大,而且还使用了开窗。别的程序tm给1g就可以了,一直运行也无问题,这个程序特殊。
开始我理解的有问题,觉得2g,内存怎么也行了,但是实际上,flink有自己的一套内存模型,有自己默认的分配策略,虽然我们给了2g,但是实际上程序处理能用的内存,也就是task heap,并没有很多。
先说下我调整之后的结果,我一怒之下tm直接给了4g,然后观察tm如下
会发现,虽然tm给了4g的内存,实际我们业务代码在进行数据处理时候用到的内存却只有1.42g
真特么坑。。。
调节过程
打开flink的官网,看下flink内存模型的介绍,地址如下
Set up TaskManager Memory | Apache Flink
flink的内存模型图如下
其中每一部分的内存都是怎么分配的,怎么计算的,有无默认值,给谁用的,这里不做详细的介绍,可以直接看flink的官方文档。这里说一下我是怎么调节的
原先的启动参数变成了如下
-Dtaskmanager.memory.process.size=3072mb
-Dtaskmanager.memory.task.heap.size=1536mb
-Dtaskmanager.memory.managed.size=512mb
因为我的flink程序并不需要使用那么大空间的托管内存,也就是managed memory。所以我这里是手动给了一个固定大小的值,然后flink的处理总内存给了3g,又因为程序对task heap使用的比较多,我直接给了一半1.5g,让其对资源进行充分的利用。其他部分的内存,flink会根据内存模型,自动的进行划分和分配。有些是直接使用的默认值,有些是按照比例给定的。
参数调整之后,再次运行flink作业,打开tm如下
调优之后的flink内存模型,在task heap处使用的我们指定的内存大小,重点是托管内存,我们手动指定了,而不是flink自动分配了,不再需要那么多的资源,而且整体内存才3g,比起我们直接设定tm运行总内存4g,还省了1g的资源。而且实际的task heap内存并不受多大的影响。
总结
这里只是针对我的flink作业,做的内存调整优化,因为我的flink作业对于托管内存使用并不大,所以我可以这样设定,各位的flink作业未必。想说的就是,各位根据自己的flink作业去灵活的调整各个部分使用的内存大小,要对照各自的flink作业和业务了解这个内存是干什么用的,根据数据量预估大概使用多少量,必要时要进行压测。在设定的过程中,整体上一定要遵守flink的内存计算规则和约束,这些在官网的介绍中都有。
最后,祝各位flink作业不挂,并且在调优的道路上越走越远。。。