00:00
那么接下来咱们以一个实际的案例给大家分析一块,分析一下咱们每一块的内存是怎么确定啊,具体是多少啊。来。好,那首先是基于模式的话,咱们是跑在容器上面,那么容器指定的内存咱们一般用的是什么。指定是进程内存啊。也就是这个参数啊。那比如说我指定为四个G啊,咱们I块来算,它是怎么计算的啊,那首先呢,先算一下这两个开销啊,就最下面这两个,那按照刚才的原则啊,咱们说云空间默认它是256兆。好,这是固定的对吧,好256这确定了,再往下我们算一下它的执行开销。实行开销,咱们说了默认比例是谁啊,0.1,所以我一乘算出来是不是大概就是一个。呃,410兆左右。对吧,409,那还要跟最大最小值比较一下,有没有在这个区间里面,那410兆咱们一比很明显在里面,对吧,所以最终它的结果就是四百一啊,410兆,那同样的我们就可以算出来弗林格内存是多大,总内存去圆空间减去执行开销,那就大概是3430兆左右啊。
01:21
Flink内存再往下,接下来我们就可以得到一个网络内存的大小了。网络内存。也就这一块,我们说它的系数默认是0.1,算出来343兆。另外跟区间比较一下,诶,没有超出区间,那就是最终就是343。再看一下一个托管内存。托管内存呢?它是咱们flink内存的默认0.4。那算出来是1372兆。啊,也就是说。也就管理内存啊,也就托管内存。那这个也就确定了。
02:00
再往下看呢,咱们的框架内存一上也好,对外也好,都是多少呢?128兆。这都确定,那接下来还有哪两块没确定呢?哎,堆上跟堆外的task内存,那我们刚才也聊到了这个堆外,呃,默认是零,也就是默认是不用啊,你要用的话,你要参数去指定,也就是说它是零,那么剩下的就是它了,Task的堆上内存。剩多少就全是他的。啊,这个就是吃别人剩菜啊,捡别人不要的,那我们就前面算出来一些一减,哎,知道它是。大概是1459兆左右啊,那这个呢,就是咱们一个内存计算的一个细节啊,结合这个内存模型。那我们提交一个案例给大家看一下啊。我把这个命令。
03:01
拷过来。把一些这个注释给删掉啊。嗯。那这个呢,是我提供给大家的一个代码啊,那咱们也先不去看它的逻辑了,我们先提交看一下内存的指令。那这个内存咱们就改成4096啊。这个是什么呢?Task manager。总进程的内存四个G对吧,咱们来看一下跟刚才算的对不对啊。那这边的包网是提交过了,上传过了,我直接提交就行了。啊,应该是有空格啊。把空格删一删啊,这里有一个。
04:02
这里有一个。再提交一遍。我们等待提交上去,我们来具体看一看task manager各块内存。好,已经在部署了。嗯。好,已经提交,我们打开页面看一下啊。在雅安页面可以看到已经提交上去了,来,咱们看一下它的UI。那我们点开这个task manager。我们点一个。大家可以看到,其实在link应该是一二版本开始啊,它在web UI上面就。提供了一个内存模型图,并且会展示呢每一块的内存有多大。
05:04
我们来投一手啊,是不是基本一样,一模一样吧。对吧。好。那接下来我们看一下算的对不对啊,咱们截个图。跟才的计算量,咱们对比一下。首先架内存百兆。我们说对内对外都一样。都是128兆,接下来呢,我们看一个圆空间256是固定的,对吧。然后呢,是一个开销410,我们看对不对。你看刚才计算CM开销的时候,是不是409.6啊,对吧,他取了就取一个四百一取整对吧,410兆,这没问题,接下来我们看一个网络内存。网络内存我们算出来呢,是343,网络内存343,你看就是这么来的呀。
06:03
再来看一个托管内存。1372。啊,在这里,这是托管内存。1372你看对吧,它是换算成了一个GB。框架内存说过了,Task内存。他剩多少?1459TASK的内存,它换算成了一个GB。是不是差不多。也不差不多就是了,对吧。这个呢,大家就可以看到,我们指定一个内存,它到底是怎么来分配的,也就是说呀,每一块内存到底是怎么确定,如何来影响,那其实从前面的介绍大家也能知道,咱们每一块的内存是不是可以去调整啊。框架内存呢,咱们一般不会去调,比如说你想增大一个网络内存,你可以怎么办呢?你是不是可以把它那个系数0.1提高啊。管理内存是不是也一样可以提高系数?也可以指定大小吧?
07:05
这个task内存怎么办呢?我们说他是什么呢,剩的。如果你的task内存不够。啊,你是不是可以考虑把其他的一些调小一点,那他不就剩的多了吗。啊,就是这么一回事啊。另外我们也可以看一下一个日志,呃,Task manager里面的日志啊,它在这里面应该有打印的一个东西,哎,就这一块。是不是一些JVM参数啊,它怎么跟这个内存模型怎么跟JVM呃的一些模型给它对应起来呢,你看。这个是不是指定堆上内存的啊,叉叉MS啊,它设为一样的,这个应该是多大呢。就是这个图嘛,我提前截好了,大家看一下。地上内存是不是大概就等于?
08:01
换算出来是。1600兆,这个其实就是什么呢?就是对内。堆内所有的内存是哪两块?这两个。啊,框架堆内跟task堆内,这个就是JM堆上内存,那接下来它指定了一个叫memory,我们叫直接内存,那么大家对比一下。直接内存是不是这一块。对,首先它是属于对外的,另外呢,它包含了三个东西啊,这三个。那你看这个图也行,是不是这三个你加一下啊,Task对外框架对外加网络内存这个是零嘛。框架的对外我们说是128网络内存刚才算出来是343,加起来呢。是不是大概等于470兆没问题吧。那最后一个。这是不是一个圆空间的大小,默默认呢,就是256兆。所以大家要看得懂啊。
09:00
内存模型JVM参数的一个。关系是怎么样的。我相信到这里呢,大家。应该也明白。它内存怎么划分啊,怎么来分配啊,咱们通过这个实际案例呢,啊计算了一遍。所以问题就来了,同学们。我内存该给多大是吧。到底它默认应该是两个G左右啊task manager。那给多大呢?有些人会建议你说八个G,有的他设到十多个G,几十个G都有。那这个呢,其实很简单的,同学们有了这张图啊,来,咱们看这张图。这边是不是有一些监控指标啊,这个指标是不是表示了它的一个使用率啊。比如说它的堆上内存是这两个,它现在使用率达到了多少?对不对。那比如说呀,你这个任务你可以测试一下,你先按默认的两个G让他提交执行。
10:06
接下来呢,你就看每一块。这种情况怎么样?举个例子啊,如果这边这些都已经都是90以上,那这边这个也90以上,90以上,90以上你可以跑一段时间看一下。那你基本上是不是应该内存调大一点。对吧,因为你要预留啊,咱们这这是一个实时流处理程序。数据,那数据。那这个时候内这个内存能顶得住吗?这个你要去考虑的。那另外呢,比如说这块达到了90多啊,这一块呢,很这块很富,这块很富裕,那这个时候你是不是该考虑把这块。用的比较多的,稍微把它调大一点,像比如说咱们现在这个管理内存是不是零啊。
11:02
为什么呢?因为这个管理内存主要是给K类型的状态来用的,说白了他给谁用的,它是给DB的。那比如说我现在提交的这个作业,我的状态指定的是一个呃,内存。就是那个哈希map state,我的状态后端不是DB,也就是说这块内存我永远都是什么零。那么基于此呢?你是不是可以把管理内存?不给了,把这个资源给去掉,对吧,你可以把比例设成零,也可以把size设成零,你这不就好了吗?对吧,说白了哪一块不够加哪一块,哪一块用的少,那就减少哪一块,那整体都紧缺,你就把总的进程内存再往上调一调,那咱们一般性的建议啊,正常咱们的task manager。正常来讲,呃,一个啊,就两个G到八个G之间是比较常见的。
12:01
你最开始先从两个G开始测啊。然后看它的一个运行情况啊,你再去调,再去调,你调到合适你当前作业的一个内存配置。所以呢,其实咱们每个作业它的一个配置是不一样的啊,我们要具体问题具体分析啊,就是这么来分析的啊。
我来说两句