一、优化目的
充分利用账号内的云节点,减少节点的闲置时间,提高采集效率,采集更多的数据。
二、云节点分配原则
1、优先级相同
先启动的任务,优先进行第一批次的节点分配,其剩余子任务和后启动任务的子任务一起随机分配。
2、启动时间相同
优先级越高的任务,越先分配到节点。
场景举例:
假设账号内有5个节点,并行任务数为5。
同时启动了10个优先级相同的任务,任务在云端会先进行拆分(假设都可以拆分)。
任务A可拆分成子任务a1,a2,a3,...,an;
任务B可拆分成子任务b1,b2,b3,...,bn;
任务C可拆分成子任务c1,c2,c3,...,cn;
......
任务J可拆分成子任务j1,j2,j3,...,jn。
此时服务端集群内有10*n个子任务{a1,a2,...,an,b1,b2,...,bn,……,j1,j2,...,jn}
分配节点进行采集时,
节点1执行任务A的某个子任务ax;
节点2执行任务B的某个子任务bx;
......
节点5执行任务E的某个子任务ex。
剩余5个任务暂时会进行等待。
此时服务端集群内有10*n-5个子任务{a2,...,an,b2,...,bn,……,j1,j2,...,jn}
当节点1完成子任务ax的采集,该节点1执行的下一个子任务是集群内的任意一个。即从10*n-5个子任务{a1,a2,...,an,b1,b2,...,bn,……,j1,j2,...,jn}任意抽一个子任务出来执行,可能是任务A的子任务a2,也可能是任务J的子任务jn。其余节点的执行逻辑同理。
故运行一段时间后会出现,任务A完成了m个子任务的采集,但还有n-m个子任务未完成,整个任务显示运行中,但暂时没有数据增加,一直空耗时间,看起来采集极慢。此时已分不出节点来执行B任务,全部的云节点都在执行其他任务中。此外节点在不同任务之间切换也会耗费大量时间。
三、启动优化
要想采集更快,节点利用率更高,主体思路是减少节点的空闲时间和在不同任务之前的切换时间。在运行中的任务不要太多,应控制同时启动的任务数。
1、分批次运行,目前软件内最多可以分成24个批次,每个批次间隔1小时。每个批次内启动的全部任务应在1小时内可以全部完成采集。如果不能完成采集,则下一个批次的任务又启动了,依旧会造成任务积压,引起在运行中的任务太多,降低采集效率。
2、同一个批次内的任务还可设置优先级,以调整这批任务每个任务的采集顺序。如该批次内有20个任务,可分成4种优先级,每5个为1组(每组内多少个任务最好根据云采集同时运行的任务数来设置,建议等于或略大)。 每个组任务子任务数总和与云占有量总和都最好大于账号节点数。
每个任务分配的云占有量,可根据任务的子任务数和数据量以及需要的紧急程度来分配。一般子任务数多的、数据量大的、急着需要数据的任务,云占有量设置大些。当然,如果这个任务不能拆分,或拆分后子任务很少,如就是3。那么即使其云占有量设置为5,它也用不了那么多云节点,因为它最多只能占用3个云节点。如果希望它能占用更多,则应该去优化规则。
3、此外还应配合调整云采集同时运行的任务数来控制,如调整为5个。调整云采集同时运行的任务数,可能会遇到一个问题:同时在运行的这几个任务都是不可拆分,造成大量节点空闲。如设置同时运行的任务数为5,而此时在运行的5个任务均是不可拆分,则此时只会使用到5个节点,其余节点都在空闲中,且不会分配给新任务。所以在设计启动时应该让5个任务的子任务数总和大于账号节点数。可拆分的任务和不可拆分的任务要搭配好,不要让某个批次某个组内的任务均是不可拆分的。
如果能比较清楚的了解每个任务云采集的完成时间,则根据完成时间来设置定时,尽量将相同耗时的任务放在同一个批次内进行启动。