一种针对IO密集型任务的调度方法及系统与流程
未命名
10-08
阅读:85
评论:0

一种针对io密集型任务的调度方法及系统
技术领域
1.本发明属于数据处理技术领域,特别涉及一种针对io密集型任务的调度方法及系统。
背景技术:
2.随着计算机技术的不断发展,业务对任务调度系统的效率要求也越来越高,如果在有限资源的场景下尽可能提高吞吐量,是一个亟待解决的问题。尤其是在任务中包含较多io操作的时候(如网络收发、磁盘读写),任务容易阻塞在io操作上,造成cpu资源的浪费;另外,如果想通过增加任务队列来弥补cpu空闲的损失,又会因为调度系统无法预知io操作阻塞的时长,从而可能造成任务堆积。
3.以上背景技术内容的公开仅用于辅助理解本发明的发明构思及技术方案,其并不必然属于本专利申请的现有技术,在没有明确的证据表明上述内容在本专利申请的申请日已经公开的情况下,上述背景技术不应当用于评价本技术的新颖性和创造性。
技术实现要素:
4.本发明的目的在于提供一种针对io密集型任务的调度方法及系统,能够结合节点负载来控制任务队列,既提高了cpu的利用率,提高了吞吐量,又避免了平均耗时的明显增加,放置任务堆积。
5.为实现上述目的,本发明提供采用如下技术方案:一种针对io密集型任务的调度方法,包括以下步骤:s1、接收任务的配置信息,录入任务代码、以及节点偏好,并将任务代码中io操作部分替换成统一的io接口;s2、根据任务执行节点上报的各个节点负载和进度信息,维护所有活跃节点负载情况;s3、接收任务执行请求,根据任务的节点偏好、节点负载情况以及过往执行耗时情况,选择合适执行节点,并下发任务;s4、执行节点执行任务执行请求,并在任务完成后上报任务结果以及执行耗时,同时将任务结果进行保存、将任务执行耗时进行更新作为过往执行耗时。
6.优选的,上述步骤s1中的io接口包括http请求封装接口和db请求封装接口。
7.优选的,所述http请求封装接口支持get和post请求,接收body、headers以及cookies参数。
8.优选的,所述db请求封装接口支持postgredb和mysql,各自包含一个建立连接方法createconnection,需要提供db的host、ip、用户名以及密码,且还提供一个query方法。
9.优选的,上述步骤s4具体步骤以下:s41、根据任务的节点偏好和节点负载情况,选择合适的执行节点;s42、将任务追加到该执行节点就绪任务队列中;s43、执行节点运行中的任务数未达到上线前,从就绪任务队列中的任务取出并执行;若就绪任务队列为空,则请求下发新任务;s44、任务执行到io接口时,执行节点重新获得控制权,将任务加入到等待任务队列;s45、io接口返回后,执行节点将该任务从等待任务队列移动到就绪任务队列;s46、任务全部完成后,执行节点负责上报任务完成信息、并更新io操作耗时以及总体耗时,最后
删除该任务。
10.优选的,上述步骤s45中,每个所述执行节点运行一个daemon程序,所述daemon程序负责将该任务挂起,并且根据先进先出原则决定从就绪队列选择一个任务,或者请求下发新任务执行。
11.一种针对io密集型任务的调度系统,用于实现上述的的调度方法,包括任务管理模块、任务调度模块以及任务执行节点:所述任务管理模块包括配置管理单元和特性管理单元,所述配置管理单元用于管理每个调度任务的静态配置信息;所述特性管理单元用于管理每个调度任务的动态信息;所述任务调度模块包括节点管理单元、任务分发单元以及结果管理单元;所述节点管理单元用于接收所有节点上报的负载和任务完成度信息,为任务分发提供依据;所述任务分发单元用于将任务分发到合适的节点;所述结果管理单元用于接收任务执行节点返回的任务结果和任务消耗时间以及io占比;所述任务执行节点包括io操作代理单元、执行管理单元以及进度负载管理单元;所述io操作代理单元接管修改后的任务代码执行过程中的io操作;所述执行管理单元,用于从就绪队列中获取待执行的任务进行执行;所述进度负载管理单元,用于更新各个任务的进度,并上报给任务调度模块。
12.优选的,上述步骤s2任务配置信息包括任务的静态配置信息和动态信息;所述静态信息包括任务代码和任务偏好;所述动态信息包括平均耗时和平均io占比。
13.优选的,所述进度负载管理单元还把任务队列数量、进度、任务执行节点的cpu、内存信息上报到任务调度模块。
14.优选的,所述执行管理单元具体为:如果遇到io操作代理单元的io接口,则将当前任务追加到任务阻塞队列末尾,并且从任务就绪队列开头继续获取任务执行。
15.与现有的技术相比,本发明具有如下有益效果:本发明中,通过将任务代码封装成统一的io接口,且并结合执行节点负载来控制任务队列,既提高了cpu的利用率,提高了吞吐量,又避免了平均耗时的明显增加。
16.本发明中,执行节点中提供io操作封装接口的实现,提供两种类型的接口:http请求接口和db请求接口,任务执行节点能够将任务在即将阻塞在io之前将任务挂起,放入阻塞队列,从而不至于阻塞线程,且能够将任务进入io等待队列中,大大提高了吞吐量。
附图说明
17.图1是本发明中调度方法流程图。
18.图2是本发明调度系统框架图。
具体实施方式
19.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
20.在本发明的描述中,需要说明的是,术语“中心”、“纵向”、“横向”“上”、“下”、“前”、“后”“左”、“右”、“竖直”、“水平”、“顶”、“底”、“顶部”、“底部”、“顶面”、“底面”、“内”、“外”、“内侧”、“外侧”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。
21.在本发明的描述中,若干的含义是一个或者多个,多个的含义是两个以上,大于、小于、超过等理解为不包括本数,以上、以下、以内等理解为包括本数。如果有描述到术语“第一”、“第二”、“第三”只是用于描述目的以及区分技术特征为目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量或者隐含指明所指示的技术特征的先后关系。
22.在本发明的描述中,需要说明的是,除非另有明确的规定和限定,术语“安装”、“相连”、“连接”、“设置”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通。对于本领域的普通技术人员而言,可以具体情况理解上述术语在本发明中的具体含义。下面根据本发明的整体结构,对其实施例进行说明。
23.请参阅图1-2,一种针对io密集型任务的调度方法,包括以下步骤:s1、接收任务的配置信息,录入任务代码、以及节点偏好,并将任务代码中io操作部分替换成统一的io接口;s2、根据任务执行节点上报的各个节点负载和进度信息,维护所有活跃节点负载情况;s3、接收任务执行请求,根据任务的节点偏好、节点负载情况以及过往执行耗时情况,选择合适执行节点,并下发任务;s4、执行节点执行任务执行请求,并在任务完成后上报任务结果以及执行耗时,同时将任务结果进行保存、将任务执行耗时进行更新作为过往执行耗时。
24.具体的,上述步骤s1中的io接口包括http请求封装接口和db请求封装接口。
25.http请求封装接口支持get和post请求,接收body、headers以及cookies参数,该方法该方法会让任务进入io等待队列。
26.db请求封装接口支持postgredb和mysql,各自包含一个建立连接方法createconnection,需要提供db的host、ip、用户名以及密码,该方法不阻塞;同时,还提供一个query方法,该方法会让任务进入io等待队列。
27.具体的,上述步骤s4具体步骤以下:s41、根据任务的节点偏好和节点负载情况,选择合适的执行节点;s42、将任务追加到该执行节点就绪任务队列中;s43、执行节点运行中的任务数未达到上线前,从就绪任务队列中的任务取出并执行;若就绪任务队列为空,则请求下发新任务;s44、任务执行到io接口时,执行节点重新获得控制权,将任务加入到等待任务队列;s45、io接口返回后,执行节点将该任务从等待任务队列移动到就绪任务队列;s46、任务全部完成后,执行节点负责上报任务完成信息、并更新io操作耗时以及总体耗时,最后删除该任务。
28.作为优化方案,上述步骤s45中,每个执行节点运行一个daemon程序,任务调用io封装接口时,daemon程序负责将该任务挂起,并且根据先进先出原则决定从就绪队列选择一个任务,或者请求下发新任务执行。
29.采用上述方案,将任务在即将阻塞在io之前将任务挂起,放入阻塞队列,从而不至于阻塞线程,大大提高了吞吐量。
30.另外,请继续参与图1-2,一种针对io密集型任务的调度系统,用于实现上述的的调度方法,包括任务管理模块、任务调度模块以及任务执行节点:任务管理模块包括配置管理单元和特性管理单元,配置管理单元用于管理每个调度任务的静态配置信息;特性管理单元用于管理每个调度任务的动态信息;执行任务前,任务提供方需要先将任务配置到配置管理单元,将代码中的io操作部分替换为本系统提供的统一io接口;发起任务时,配置管理单元向任务调度模块提供这些信息,任务执行结束后,特性管理单元从任务调度模块接收平均执行耗时、平均io占比信息,用于下次同类任务发起时作为调度依据。
31.任务调度模块包括节点管理单元、任务分发单元以及结果管理单元;节点管理单元用于接收所有节点上报的负载和任务完成度信息,为任务分发提供依据;任务分发单元用于将任务分发到合适的节点;结果管理单元用于接收任务执行节点返回的任务结果和任务消耗时间以及io占比;任务执行节点包括io操作代理单元、执行管理单元以及进度负载管理单元;io操作代理单元接管修改后的任务代码执行过程中的io操作;执行管理单元,用于从就绪队列中获取待执行的任务进行执行;进度负载管理单元,用于更新各个任务的进度,并上报给任务调度模块。
32.具体的,上述步骤s2任务配置信息包括任务的静态配置信息和动态信息;静态信息包括任务代码和任务偏好;动态信息包括平均耗时和平均io占比。
33.具体的,进度负载管理单元还把任务队列数量、进度、任务执行节点的cpu、内存信息上报到任务调度模块。
34.具体的,执行管理单元具体为:如果遇到io操作代理单元的io接口,则将当前任务追加到任务阻塞队列末尾,并且从任务就绪队列开头继续获取任务执行。
35.上述一种针对io密集型任务的调度系统的工作原理为:1、任务管理模块接收任务配置,录入任务代码、节点偏好,并将任务代码中的io操作替换为本系统提供统一的io接口。
36.2、任务调度模块接收任务执行节点上报的节点负载和进度信息,维护所有活跃节点的负载情况。
37.3、任务调度模块接收任务执行请求,根据任务偏好信息和节点负载情况以及任务过往执行耗时情况,计算得到适合执行的节点,并下发任务。
38.4、任务执行节点执行接收到的任务请求,并在任务完成后上报任务结果以及执行耗时情况给任务调度模块。
39.5、任务调度模块将任务执行结果保存,并将任务执行耗时更新到任务管理模块。
40.例如,企业经常有大规模频繁生成业务报表的需求,这些报表的生成一般都需要通过http请求或者查询db来获取数据源,生成完毕后再通过http请求发送报表。这些报表的生成过程中,http请求和db请求造成的耗时比例很高,每个请求的io操作通常需要1~5秒,而计算通常只需要几十毫秒。以往的实现过程中发现,即使使用了线程池也难以达到期望的吞吐量,线程池大小达到300以上之后已经没有帮助了,线程池过大反而会因为线程切换频繁而导致效率降低。
41.使用本发明的调度算法和系统之后,只需要稍微改动一下报表生成代码,将http请求和db请求改成封装的接口就能将任务平均耗时降低到百毫秒级别,而线程池的大小只需要比cpu核心数略多即可。
42.前述对本发明的具体示例性实施方案的描述是为了说明和例证的目的,这些描述并非想将本发明限定为所公开的精确形式,并且很显然,根据上述教导,可以进行很多改变和变化,尽管已经示出和描述了本发明的实施例,但本具体实施例仅仅是对本发明的解释,其并不是对发明的限制,描述的具体特征、结构、材料或者特点可以在任何一个或多个实施例或示例中以合适的方式结合,对示例性实施例进行选择和描述的目的在于解释本发明的特定原理及其实际应用,从而使得本领域的技术人员能够在阅读完本说明书后可在不脱离本发明的原理和宗旨的情况下,可以根据需要对实施例做出没有创造性贡献的修改、替换、变型以及各种不同的选择和改变,但只要在本发明的权利要求范围内都受到专利法的保护。
技术特征:
1.一种针对io密集型任务的调度方法,其特征在于,包括以下步骤:s1、接收任务的配置信息,录入任务代码、以及节点偏好,并将任务代码中io操作部分替换成统一的io接口;s2、根据任务执行节点上报的各个节点负载和进度信息,维护所有活跃节点负载情况;s3、接收任务执行请求,根据任务的节点偏好、节点负载情况以及过往执行耗时情况,选择合适执行节点,并下发任务;s4、执行节点执行任务执行请求,提供io接口的实现,并在任务完成后上报任务结果以及执行耗时,同时将任务结果进行保存、将任务执行耗时进行更新作为过往执行耗时。2.根据权利要求1所述的一种针对io密集型任务的调度方法,其特征在于,上述步骤s4中的io接口的实现包括http请求封装接口和db请求封装接口。3.根据权利要求2所述的一种针对io密集型任务的调度方法,其特征在于,所述http请求封装接口支持get和post请求,接收body、headers以及cookies参数。4.根据权利要求2所述的一种针对io密集型任务的调度方法,其特征在于,所述db请求封装接口支持postgredb和mysql,各自包含一个建立连接方法createconnection,需要提供db的host、ip、用户名以及密码,且还提供一个query方法。5.根据权利要求1所述的一种针对io密集型任务的调度方法,其特征在于,上述步骤s4具体步骤以下:s41、根据任务的节点偏好和节点负载情况,选择合适的执行节点;s42、将任务追加到该执行节点就绪任务队列中;s43、执行节点运行中的任务数未达到上线前,从就绪任务队列中的任务取出并执行;若就绪任务队列为空,则请求下发新任务;s44、任务执行到io接口时,执行节点重新获得控制权,将任务加入到等待任务队列;s45、io接口返回后,执行节点将该任务从等待任务队列移动到就绪任务队列;s46、任务全部完成后,执行节点负责上报任务完成信息、并更新io操作耗时以及总体耗时,最后删除该任务。6.根据权利要求5所述的一种针对io密集型任务的调度方法,其特征在于,上述步骤s45中,每个所述执行节点运行一个daemon程序,所述daemon程序负责将该任务挂起,并且根据先进先出原则决定从就绪队列选择一个任务,或者请求下发新任务执行。7.一种针对io密集型任务的调度系统,用于实现权利要求1-5任一项所述的调度方法,其特征在于,包括任务管理模块、任务调度模块以及任务执行节点:所述任务管理模块包括配置管理单元和特性管理单元,所述配置管理单元用于管理每个调度任务的静态配置信息;所述特性管理单元用于管理每个调度任务的动态信息;所述任务调度模块包括节点管理单元、任务分发单元以及结果管理单元;所述节点管理单元用于接收所有节点上报的负载和任务完成度信息,为任务分发提供依据;所述任务分发单元用于将任务分发到合适的节点;所述结果管理单元用于接收任务执行节点返回的任务结果和任务消耗时间以及io占比;所述任务执行节点包括io操作代理单元、执行管理单元以及进度负载管理单元;所述io操作代理单元接管修改后的任务代码执行过程中的io操作;所述执行管理单元,用于从就绪队列中获取待执行的任务进行执行;所述进度负载管理单元,用于更新各个任务的进
度,并上报给任务调度模块。8.根据权利要求7所述的一种针对io密集型任务的调度系统,其特征在于,上述步骤s2任务配置信息包括任务的静态配置信息和动态信息;所述静态信息包括任务代码和任务偏好;所述动态信息包括平均耗时和平均io占比。9.根据权利要求7所述的一种针对io密集型任务的调度系统,其特征在于,所述进度负载管理单元还把任务队列数量、进度、任务执行节点的cpu、内存信息上报到任务调度模块。10.根据权利要求7所述的一种针对io密集型任务的调度系统,其特征在于,所述执行管理单元具体为:如果遇到io操作代理单元的io接口,则将当前任务追加到任务阻塞队列末尾,并且从任务就绪队列开头继续获取任务执行。
技术总结
本发明涉及数据处理技术领域,具体公开了一种针对IO密集型任务的调度方法及系统,包括:任务管理模块接收任务配置,录入任务代码、节点偏好,并将任务代码中的IO操作替换为统一的IO接口;任务调度模块接收任务执行节点上报的节点负载和进度信息,维护活跃节点的负载情况;任务调度模块接收任务执行请求,根据任务偏好、节点负载任务和过往执行耗时情况,得到适合执行的节点,并下发任务;任务执行节点执行接收到的任务请求,并在任务完成后上报任务结果以及执行耗时情况给任务调度模块;任务调度模块将任务执行结果保存,并将任务执行耗时更新到任务管理模块。本发明既提高了CPU的利用率,提高了吞吐量,又避免了平均耗时的明显增加。增加。增加。
技术研发人员:黄云 杨程 覃迪 唐红艳 曾民钊 钟方富 杨友盛 孙钟晓 农怡静 陈奕宏
受保护的技术使用者:广西计算中心有限责任公司
技术研发日:2023.06.30
技术公布日:2023/10/6
版权声明
本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
航空之家 https://www.aerohome.com.cn/
飞机超市 https://mall.aerohome.com.cn/
航空资讯 https://news.aerohome.com.cn/