一种任务分配方法、装置、设备及存储介质与流程

文档序号:27918448发布日期:2021-12-11 10:53阅读:103来源:国知局
一种任务分配方法、装置、设备及存储介质与流程

1.本发明涉及数据处理技术领域,更具体地说,涉及一种任务分配方法、装置、设备及存储介质。


背景技术:

2.在网络流量解析时,需要实时处理海量的流量数据。为保证数据的处理性能以及系统的可维护性,通常在处理完一批数据包后,确定这时没有新的数据包进入系统时,系统会进行短暂的休眠(几十微秒);但是在系统进入睡眠的这段时间,如果有新的数据产生,系统则无法感知。通常在流量进入系统时会分配一定大小的队列,如果休眠期间的流量非常大,则可能超出预分配的空间,从而造成数据丢失。
3.因此在这种情况下,一般都采用主动采用轮询的方式,不断地去查看是否有新的流量进入系统。但是这种方式将会100%负荷去工作,即没有数据包进入系统时,也会因为主动轮询对其分配到的线程资源100%的使用,这显然不利于多系统的均衡负载,使得系统的可用性大大降低。


技术实现要素:

4.本发明的目的是提供一种任务分配方法、装置、设备及存储介质,能够基于各工作线程实际的负载情况实现任务分配,有利于多系统的负载均衡,能够使得系统的可用性大大提高。
5.为了实现上述目的,本发明提供如下技术方案:
6.一种任务分配方法,包括:
7.在每个采集周期内分别连续多次采集各工作线程的工作状态;
8.基于当前采集周期内连续多次采集到的各工作线程的工作状态,确定当前采集周期内各工作线程被采集到为正在执行任务的工作状态的次数,并基于当前采集周期内各工作线程对应数量、各工作线程对应上一采集周期的负载值及当前采集周期内连续采集各工作线程的工作状态的次数,计算各工作线程当前的负载值;
9.基于各工作线程当前的负载值进行任务分配。
10.优选的,计算各工作线程当前的负载值,包括:
11.按照下列公式计算各工作线程当前的负载值:
12.util_2=(util_1*0.75)+((works/ticks)*100*0.25),
13.其中,util_2为各工作线程中任意工作线程当前的负载值,util_1为该任意工作线程对应上一采集周期的负载值,works为当前采集周期内该任意工作线程被采集到为正在执行任务的工作状态的次数,ticks为当前采集周期内连续采集各工作线程的工作状态的次数。
14.优选的,在每个采集周期内分别连续多次采集各工作线程的工作状态,包括:
15.在每个采集周期内分别连续多次采集各工作线程的状态标记的值;其中,所述状
态标记为对应工作线程维护的表示正在执行任务的工作状态及未在执行任务的工作状态具有不同值的标记;
16.相应的,确定当前采集周期内任意工作线程的工作状态是否表示正在执行任务,包括:
17.如果当前采集周期内采集到的任意工作线程的状态标记的值为表示正在执行任务的值,则确定该任意工作线程正在执行任务,如果当前采集周期内采集到的任意工作线程的状态标记的值为表示未在执行任务的值,则确定该任意工作线程未在执行任务。
18.优选的,在每个采集周期内分别连续多次采集各工作线程的工作状态之前,还包括:
19.创建一个主线程和多个工作线程,并将所述主线程及所述工作线程均以一一对应的方式分别绑定至多个cpu上;
20.指示所述主线程执行在每个采集周期内分别连续多次采集各工作线程的工作状态至基于各工作线程当前的负载值进行任务分配的步骤。
21.优选的,将所述主线程及所述工作线程均以一一对应的方式分别绑定至多个cpu上之后,还包括:
22.如果存在任意工作线程在预设时间间隔内未执行任何任务,则回收该任意工作线程,待需要时将该任意工作线程再次绑定至对应的cpu。
23.优选的,基于各工作线程当前的负载值进行任务分配,包括:
24.如果需要对任意任务进行分配,则按照优先分配任务给当前的负载值最小的工作线程的原则对该任意任务进行分配。
25.优选的,所述状态标记具体为volatile变量。
26.一种任务分配装置,包括:
27.采集模块,用于:在每个采集周期内分别连续多次采集各工作线程的工作状态;
28.计算模块,用于:基于当前采集周期内连续多次采集到的各工作线程的工作状态,确定当前采集周期内各工作线程被采集到为正在执行任务的工作状态的次数,并基于当前采集周期内各工作线程对应数量、各工作线程对应上一采集周期的负载值及当前采集周期内连续采集各工作线程的工作状态的次数,计算各工作线程当前的负载值;
29.分配模块,用于:基于各工作线程当前的负载值进行任务分配。
30.一种任务分配设备,包括:
31.存储器,用于存储计算机程序;
32.处理器,用于执行所述计算机程序时实现如上任一项所述任务分配方法的步骤。
33.一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如上任一项任务分配方法的步骤。
34.本发明提供了一种任务分配方法、装置、设备及存储介质,该方法包括:在每个采集周期内分别连续多次采集各工作线程的工作状态;基于当前采集周期内连续多次采集到的各工作线程的工作状态,确定当前采集周期内各工作线程被采集到为正在执行任务的工作状态的次数,并基于当前采集周期内各工作线程对应数量、各工作线程对应上一采集周期的负载值及当前采集周期内连续采集各工作线程的工作状态的次数,计算各工作线程当前的负载值;基于各工作线程当前的负载值进行任务分配。本技术在每个采集周期内分别
连续多次采集各工作线程的工作状态,基于当前采集周期内任意工作线程被采集到表示正在执行任务以实现相应数据处理的工作状态的次数、该任意工作线程在上一采集周期内计算得到的负载值以及当前采集周期内连续采集该任意工作线程的工作状态的次数,计算出该任意工作线程当前的负载值,从而得到当前采集周期内各工作线程当前的负载值,进而基于各工作线程当前的负载值实现任务分配。可见,本技术基于各工作线程当前采集周期的数据处理情况及上一采集周期的数据处理情况,综合计算出各工作线程当前实际的负载值,进而基于各工作线程当前的负载值实现用于处理数据的任务的分配,从而能够基于各工作线程实际的负载情况实现任务分配,有利于多系统的负载均衡,能够使得系统的可用性大大提高。
附图说明
35.为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
36.图1为本发明实施例提供的一种任务分配方法的流程图;
37.图2为本发明实施例提供的一种任务分配装置的结构示意图。
具体实施方式
38.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
39.请参阅图1,其示出了本发明实施例提供的一种任务分配方法的流程图,具体可以包括:
40.s11:在每个采集周期内分别连续多次采集各工作线程的工作状态。
41.其中,线程(thread)是操作系统能够进行运算调度的最小单位,工作线程(worker线程)则为对数据进行处理的、需要计算负载的线程,而对数据进行处理则是通过执行相应的任务实现的。本技术实施例中可以根据实际需求设置采集周期,进而在每个采集周期内均连续多次获取各工作线程的工作状态,也即在单个采集周期内连续多次获取各工作线程的工作状态;例如采集周期为10ms,则每隔10ms就连续多次采集各工作线程的工作状态,即每秒执行100次连续多次采集各工作线程的工作状态的步骤,而多次采集各工作线程的工作状态中的多次可以为1000次。
42.s12:基于当前采集周期内连续多次采集到的各工作线程的工作状态,确定当前采集周期内各工作线程被采集到为正在执行任务的工作状态的次数,并基于当前采集周期内各工作线程对应数量、各工作线程对应上一采集周期的负载值及当前采集周期内连续采集各工作线程的工作状态的次数,计算各工作线程当前的负载值。
43.工作线程的工作状态可以包括两种,分别为正在执行任务及未在执行任务,也即分别为正在处理数据及未在处理数据;相应的,在任意单个采集周期内连续多次采集到各
工作线程的工作状态后,对于该任意单个采集周期内连续多次采集到的各工作线程的工作状态,获取任意工作线程的工作状态被采集到为正在执行任务的工作状态的次数,获取基于该任意工作线程在上一采集周期内采集到的工作状态计算得到的负载值(负载值的初始值可以设置为0),以及获取该任意单个采集周期内连续采集该任意工作线程的工作状态的次数(在单个采集周期内采集各工作线程的工作状态的次数相同,因此单个工作线程的工作状态被获取次数,也即为各工作线程的工作状态在单个采集周期内分别被采集的次数),进而利用上述三项参数计算该任意工作线程当前的负载值,从而能够使得该负载值能够有效体现出相应工作线程在单个采集周期内的实际负载情况。
44.s13:基于各工作线程当前的负载值进行任务分配。
45.在确定出各工作线程当前的负载值之后,则可以根据各工作线程当前的负载值分配任务,有效实现负载均衡。
46.本技术在每个采集周期内分别连续多次采集各工作线程的工作状态,基于当前采集周期内任意工作线程被采集到表示正在执行任务以实现相应数据处理的工作状态的次数、该任意工作线程在上一采集周期内计算得到的负载值以及当前采集周期内连续采集该任意工作线程的工作状态的次数,计算出该任意工作线程当前的负载值,从而得到当前采集周期内各工作线程当前的负载值,进而基于各工作线程当前的负载值实现任务分配。可见,本技术基于各工作线程当前采集周期的数据处理情况及上一采集周期的数据处理情况,综合计算出各工作线程当前实际的负载值,进而基于各工作线程当前的负载值实现用于处理数据的任务的分配,从而能够基于各工作线程实际的负载情况实现任务分配,有利于多系统的负载均衡,能够使得系统的可用性大大提高。
47.本发明实施例提供的一种任务分配方法,计算各工作线程当前的负载值,可以包括:
48.按照下列公式计算各工作线程当前的负载值:
49.util_2=(util_1*0.75)+((works/ticks)*100*0.25),
50.其中,util_2为各工作线程中任意工作线程当前的负载值,util_1为该任意工作线程对应上一采集周期的负载值,works为当前采集周期内该任意工作线程被采集到为正在执行任务的工作状态的次数,ticks为当前采集周期内连续采集各工作线程的工作状态的次数。
51.本技术实施例在单个采集周期内采集任意工作线程的工作状态的次数记录为ticks,该任意工作线程的工作状态为正在执行任务的次数记录为works,可以按照公式util_2=(util_1*0.75)+(now_work*0.25)计算该任意工作线程当前的负载值,从而实现各工作线程当前实际负载情况的计算。
52.本发明实施例提供的一种任务分配方法,在每个采集周期内分别连续多次采集各工作线程的工作状态,可以包括:
53.在每个采集周期内分别连续多次采集各工作线程的状态标记的值;其中,状态标记为对应工作线程维护的表示正在执行任务的工作状态及未在执行任务的工作状态具有不同值的标记;
54.相应的,确定当前采集周期内任意工作线程的工作状态是否表示正在执行任务,可以包括:
55.如果当前采集周期内采集到的任意工作线程的状态标记的值为表示正在执行任务的值,则确定该任意工作线程正在执行任务,如果当前采集周期内采集到的任意工作线程的状态标记的值为表示未在执行任务的值,则确定该任意工作线程未在执行任务。
56.需要说明的是,本技术在实现线程初始化时,可以为每一个工作线程分别创建对应的sample_data标记(即状态标记);其中,sample_data具体可以为volatile变量(volatile是一个特征修饰符(type specifier),作用是作为指令关键字确保本条指令不会因编译器的优化而省略,且要求每次直接读值),从而能够准确反映工作线程的实时状态。对于各工作线程中的任意工作线程来说,该任意工作线程获取任务task,如果获取成功则将sample_data设置为表示正在执行任务的值(如1)并开始执行任务,反之则继续获取任务task,直到获取到任务为止;该任意工作线程获取到任务后对任务进行操作,即工作线程需要统计的负载实体;该任意工作线程完成任务,并将sample_data设置为表示未在执行任务的值(如0),表示结束任务,然后接着获取任务;从而通过状态标记的设置便于工作线程对自身工作状态的维护,也便于对各工作线程的工作状态的有效获取。
57.本发明实施例提供的一种任务分配方法,在每个采集周期内分别连续多次采集各工作线程的工作状态之前,还可以包括:
58.创建一个主线程和多个工作线程,并将主线程及工作线程均以一一对应的方式分别绑定至多个cpu上;
59.指示主线程执行在每个采集周期内分别连续多次采集各工作线程的工作状态至基于各工作线程当前的负载值进行任务分配的步骤。
60.本技术在实现负载计算及任务分配之前需要创建线程,具体来说,可以创建一个主线程master(master线程为主线程/监管线程,用于实时获取worker线程的工作状态)和n个工作线程worker_1、worker_2...worker_n,主线程绑定在序号为0的cpu_0上,工作线程分别绑定到cpu_1、cpu_2...cpu_n上,每个线程均独立运行在一个cpu上,从而保证各线程能够高效率执行。
61.本发明实施例提供的一种任务分配方法,将主线程及工作线程均以一一对应的方式分别绑定至多个cpu上之后,还可以包括:
62.如果存在任意工作线程在预设时间间隔内未执行任何任务,则回收该任意工作线程,待需要时将该任意工作线程再次绑定至对应的cpu。
63.其中,预设时间间隔可以根据实际需要进行设定;为了避免对线程资源的浪费,本技术实施例在任意工作线程一定时长内未执行任务时,可以从该任意工作线程所在的cpu上对该任意工作线程进行回收,进而在任务数据较多、需要较多线程资源或者是工作人员指示下,将该任意工作线程再次绑定至回收之前所绑定的cpu。
64.本发明实施例提供的一种任务分配方法,基于各工作线程当前的负载值进行任务分配,可以包括:
65.如果需要对任意任务进行分配,则按照优先分配任务给当前的负载值最小的工作线程的原则对该任意任务进行分配。
66.本技术实施例中当需要对任意任务进行分配时,则将其优先分配给当前负载值最小的工作线程,从而以这种方式优先使用负载值最小的工作线程处理当前需要分配的任务,进而有效实现负载均衡。
67.在一种具体实现方式中,本发明实施例提供的一种任务分配方法具体可以包括以下步骤:
68.a、创建线程:创建一个主线程master和n个工作线程worker_1,worker_2...worker_n,主线程绑定在序号为0的cpu_0上,工作线程分别绑定到cpu_1、cpu_2...cpu_n上,每个线程独立运行在一个cpu上。
69.b、初始化:为每一个工作线程分别创建对应的sample_data标记,其中sample_data是volatile变量,能够准确反映工作线程的实时状态。
70.c、处理任务:
71.c1、工作线程获取任务task,如果获取成功则将sample_data设置为1并开始任务,反之则继续获取任务task,直到获取到任务为止;
72.c2、工作线程对任务进行操作,即工作线程需要统计的负载实体;
73.c3、工作线程完成任务,并将sample_data设置为0,表示结束任务;
74.c5、工作线程重复c1到c3流程。
75.d、采集样本:
76.主线程每隔10ms执行一次样本采集,即每秒执行100次;对每个工作线程sample_data进行样本采集,每次连续采集1000次。
77.e、计算结果:
78.采集总次数记录为ticks,sample_data为1的次数记录为works,利用公式util_2=(util_1*0.75)+(now_work*0.25)计算当前工作线程负载util2;其中,0.75及0.25分别为相应的权重,当然也可以根据实际需要设置为其他的值。
79.重复上述步骤,计算出每个工作线程当前的负载值。伪代码如下:
80.[0081][0082]
f、均衡负载:
[0083]
根据每个工作线程的不同负载进行分配任务。
[0084]
本技术利用master线程周期性采集worker线程的数据样本,通过统计迭代,计算出worker线程当前的负载情况,进而基于计算得到的负载情况有效实现负载均衡;可见,本技术提供的工作线程负载计算方法,在实际使用中能够准确反映线程的负载情况,且本技术能保证工作线程不间断地主动轮询,提高性能的同时,实时获取系统状态,并做负载均衡。另外,本技术处于技术底层,适用于任何业务。
[0085]
本发明实施例还提供了一种任务分配装置,如图2所示,可以包括:
[0086]
采集模块11,用于:在每个采集周期内分别连续多次采集各工作线程的工作状态;
[0087]
计算模块12,用于:基于当前采集周期内连续多次采集到的各工作线程的工作状态,确定当前采集周期内各工作线程被采集到为正在执行任务的工作状态的次数,并基于当前采集周期内各工作线程对应数量、各工作线程对应上一采集周期的负载值及当前采集周期内连续采集各工作线程的工作状态的次数,计算各工作线程当前的负载值;
[0088]
分配模块13,用于:基于各工作线程当前的负载值进行任务分配。
[0089]
本发明实施例还提供了一种任务分配设备,可以包括:
[0090]
存储器,用于存储计算机程序;
[0091]
处理器,用于执行计算机程序时实现如上任一项任务分配方法的步骤。
[0092]
本发明实施例还提供了一种计算机可读存储介质,计算机可读存储介质上存储有计算机程序,计算机程序被处理器执行时实现如上任一项任务分配方法的步骤。
[0093]
需要说明的是,本发明实施例提供的一种任务分配装置、设备及存储介质中相关部分的说明请参见本发明实施例提供的一种任务分配方法中对应部分的详细说明,在此不再赘述。另外本发明实施例提供的上述技术方案中与现有技术中对应技术方案实现原理一致的部分并未详细说明,以免过多赘述。
[0094]
对所公开的实施例的上述说明,使本领域技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1