一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

分布式编译的方法及系统与流程

2022-06-25 02:23:11 来源:中国专利 TAG:


1.本公开涉及编译技术领域,具体涉及一种分布式编译的方法及系统。


背景技术:

2.编译是指将某种语言的对象文件转化为使机器可识别且执行目标程序的过程。为了加快编译速度,可以采用分布式的编译方法,由多台执行机同时进行一个编译任务的不同子任务。然而,相关技术提供的分布式编译方法无法满足对编译效率的需求。


技术实现要素:

3.有鉴于此,本公开提供一种分布式编译方法及系统,以提升分布式编译的编译效率。
4.第一方面,提供一种分布式编译方法,应用于服务端,所述方法包括:接收客户端发送的待编译文件的编译任务,其中,所述编译任务包括第一子任务;获取编译集群中每台执行机的负载信息;根据所述负载信息从所述编译集群中选择用于执行所述第一子任务的执行机。
5.可选地,在一些实施例中,所述根据所述负载信息从所述编译集群中选择用于执行所述第一子任务的执行机由反向代理完成。
6.可选地,在一些实施例中,所述方向代理包括nginx。
7.可选地,在一些实施例中,所述nginx用于调用负载均衡组件,以完成所述根据所述负载信息从所述编译集群中选择用于执行所述第一子任务的执行机。
8.可选地,在一些实施例中,所述nginx包括多个nginx入口。
9.可选地,在一些实施例中,所述编译集群包括第一执行机,所述获取编译集群中每台执行机的负载信息包括:上报所述第一执行机的负载信息。
10.可选地,在一些实施例中,所述上报所述第一执行机的负载信息由上报组件完成。
11.可选地,在一些实施例中,所述获取编译集群中每台执行机的负载信息还包括:收集和存储所述编译集群中每台执行机上报的所述负载信息。
12.可选地,在一些实施例中,所述收集和存储所述编译集群中每台执行机上报的所述负载信息由服务发现组件完成。
13.可选地,在一些实施例中,所述服务发现组件包括以下工具中的至少一种:etcd、redis以及zookeeper。
14.可选地,在一些实施例中,所述编译集群中的执行机包括容器。
15.可选地,在一些实施例中,所述根据所述负载信息从所述编译集群中选择用于执行每个子任务的执行机包括:利用所述负载信息得到所述编译集群中每个执行机的权重;根据所述每个执行机的权重选择用于执行所述第一子任务的执行机。
16.可选地,在一些实施例中,所述负载信息为所述执行机的实时负载信息。
17.可选地,在一些实施例中,所述客户端为distcc客户端。
18.第二方面,提供一种分布式编译的系统,应用于服务端,所述系统包括:接收组件,被配置为接收客户端发送的待编译文件的编译任务,其中,所述编译任务包括第一子任务;获取组件,被配置为获取编译集群中每台执行机的负载信息;选择组件,被配置为根据所述负载信息从所述编译集群中选择用于执行所述第一子任务的执行机。
19.可选地,在一些实施例中,所述选择组件包括反向代理服务器。
20.可选地,在一些实施例中,所述反向代理服务器包括nginx。
21.可选地,在一些实施例中,所述选择组件还包括负载均衡组件,所述nginx用于调用所述负载均衡组件,以根据所述负载信息从所述编译集群中选择用于执行所述第一子任务的执行机。
22.可选地,在一些实施例中,所述nginx包括多个nginx入口。
23.可选地,在一些实施例中,所述编译集群包括第一执行机,所述获取组件包括:上报组件,被配置为上报所述第一执行机的负载信息。
24.可选地,在一些实施例中,所述获取组件还包括:服务发现组件,被配置为收集和存储所述上报组件上报的所述负载信息。
25.可选地,在一些实施例中,所述服务发现组件包括以下工具中的至少一种:etcd、redis以及zookeeper。
26.可选地,在一些实施例中,所述根据所述负载信息从所述编译集群中选择用于执行每个子任务的执行机包括:利用所述负载信息得到所述编译集群中每个执行机的权重;根据所述每个执行机的权重选择用于执行所述第一子任务的执行机。
27.可选地,在一些实施例中,所述负载信息为所述执行机的实时负载信息。
28.可选地,在一些实施例中,所述客户端为distcc客户端。
29.第三方面,提供一种计算机可读存储介质,其上存储有可执行代码,当所述可执行代码被执行时,能够实现如第一方面所述的方法。
30.第四方面,提供一种计算机程序产品,包括可执行代码,当所述可执行代码被执行时,能够实现如第一方面所述的方法。
31.本公开实施例提供的分布式编译方法,通过在服务端利用执行机的负载信息确定用于执行编译任务中子任务的执行机,可以简化分布式编译客户端的配置,提升分布式编译的效率。
附图说明
32.图1是相关技术提供的分布式编译系统的结构示意图。
33.图2是本公开一实施例提供的分布式编译方法的流程示意图。
34.图3是本公开一实施例提供的分布式编译系统的结构示意图。
35.图4是本公开又一实施例提供的分布式编译系统的结构示意图。
36.图5是本公开又一实施例提供分布式编译系统的结构示意。
37.图6是本公开一实施例提供的客户端视角的分布式编译系统的结构示意图。
具体实施方式
38.下面对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例
仅是本公开一部分实施例,而不是全部的实施例。
39.为了使方案更加清楚,首先对与本公开方案相关的概念进行简要介绍。
40.程序设计语言是用于书写计算机程序的语言。高级程序设计语言(或称高级语言)是程序设计语言的一种。高级语言在不同的平台上会被编译成不同的机器语言,而不是直接被机器执行。因此,高级语言使得计算机程序设计语言不再过度地倚赖某种特定的机器或环境。高级语言例如可以指java、c、c 等。
41.计算机程序(或称计算机软件或软件),是指为了得到某种结果而可以由计算机等具有信息处理能力的装置执行的代码化指令序列,或者可以被自动转换成代码化指令序列的符号化指令序列或者符号化语句序列。
42.计算机程序通常包括两种表现形式:目标代码和源代码。目标代码(或称目标程序),指计算机科学中编译器或汇编器处理源代码后所生成的代码,它一般由机器代码或接近于机器语言的代码组成。源代码(或称源程序)可以由高级语言编写。通过编译可以将源代码转换为目标代码。编译可以指将高级语言(例如源代码)变成计算机可以识别的二进制语言(例如目标代码)的过程。
43.随着程序中源代码的体量增加,单机编译(或称本地编译)逐渐无法满足程序开发对编译效率的需求。为了提升编译效率,可以使用分布式编译。作为一个示例,假设单机编译命令为:gcc

c main.c

o main.o。当需要进行分布式编译时,需要对编译命令进行分布式适配,可以将编译命令修改为:&&distcc gcc-c main-o main.o。
44.图1是相关技术提供的分布式编译系统的结构示意图。如图1所示,分布式编译系统可以包括客户端110以及多台执行机121~12n。
45.客户端110可以指任意形式的可以用于计算的电子设备。例如,客户端110可以指服务器、计算机、笔记本、手机、平板电脑等。客户端110也可以指安装并运行在电子设备中的由程序语言编制形成的逻辑体。当客户端110指安装并运行在电子设备中的由程序语言编制形成的逻辑体时,客户端110可以根据实际的需求安装在某些电子设备上。例如,可以将客户端110安装在用户的电脑上。
46.执行机也可以称为编译机、辅助编译机、远程环境、编译环境等。执行机121~12n可以指任意形式的电子设备。例如,执行机121~12n可以指具有实体形式的物理机,也可以指云服务器。执行机121~12n可以都为物理机,也可以都为云服务器或二者的组合,本公开对执行机的具体实现形式不做限定。
47.每台执行机(例如执行机121~12n)可以支持任意数量的并发或并行,本公开对每台执行机可以支持的最大并发或并行数量不做限定。并发可以指同一时刻执行机上可以执行多个任务,但每个任务不同时执行。并行可以指同一时执行机上可以同时执行多个任务。
48.客户端110可以接收编译任务。编译任务可以包括多个子任务。每个子任务可以指待编译程序的源代码的一部分。例如,源代码可以由多个文件组成,每个子任务可以指编译多个文件中的一个或多个文件的任务。又如,每个子任务可以指编译一个编译单元的任务。
49.客户端110接收到编译任务后,可以将编译任务的多个子任务分发给执行机121~12n,以通过分布式的形式完成对源代码的编译。
50.为了便于理解,以客户端110为distcc客户端为例,简要介绍分布式编译的过程。
51.distcc是一种分布式编译工具,通常包括distcc和distccd。distcc是客户端,可
以部署在分发编译任务的服务器上。distccd是服务端,可以部署在用于远程协助编译的执行机上。distcc客户端可以向执行机发送编译子任务。执行机在接收到子任务后,可以对子任务进行处理,例如对客户端下发的文件进行编译。
52.distcc使用简单的分发方式选择用于执行子任务的执行机。例如,distcc可以从配置的执行机列表中随机选择一个用于执行子任务的执行机。配置方式可以通过设置环境变量完成。例如,可以使用配置语句:export distcc_hosts="
‑‑
randomize host1/50host2/50host3/50"。其中,
“‑‑
randomize”表示随机分法。“/”后面的数字表示槽位数。“/50”表示拥有50个槽位数,支持50个并发。host1、host2、host3表示执行机的ip地址。
53.可以看出,distcc不能真正根据子任务的负载为子任务分配执行机。因此,子任务的分配可能不合理。例如,distcc可能为已经分配了较重的编译任务的执行机继续分配新的子任务,而另一些执行机可能处于空闲状态。较重的编译任务例如可以指需要编译时间较长的子任务或cpu占用率较高的子任务等。
54.作为一个示例,编译任务可以包括多个子任务。每个子任务也可以称为一个编译单元。有的子任务较小,可能10秒编完,有的子任务较大,可能20分钟才编完。然而,对于客户端,执行不同子任务的执行机的负载被视为等重。如果有新的子任务,客户端可能将新的子任务分发给执行大单元(例如需要编译20分钟的子任务)的执行机。因此,可能导致最终的编译时长较长,而且可能导致很多编译机处于空闲状态。
55.此外,根据上文提及的客户端的配置方式可以看出,客户端需要主动配置执行机的ip,以获取分布式编译的能力。因此,执行机对于客户端而言并非透明的,需要手动进行适配。当需要修改用于分布式编译的执行机时,需要在客户端侧重新进行配置,无法动态实现执行机的扩缩容。
56.可见,现有技术提供的分布式编译方法不能提供满足实际的编译需求。
57.有鉴于此,本公开提供一种分布式编译方法和系统。下面对本公开提供的方案进行详细的介绍。
58.图2是本公开一实施例提供的分布式编译方法的流程示意图。本公开提供的方法可以应用于分布式编译的服务端。服务端可以为客户端提供服务。例如,服务端可以向客户端提供分布式编译服务。在一些实施例中,服务端可以独立于客户端部署。作为一个示例,服务端和客户端可以安装于不同的电子设备上。该电子设备可以是任意类型的具有信息处理能力的装置。例如,该电子设备可以是物理机(例如笔记本电脑、台式机等)、弹性云主机等。
59.如图2所示,该方法可以包括步骤s210至步骤s230。在步骤s210,接收客户端发送的待编译文件的编译任务。客户端可以指为用户提供服务的程序。例如,客户端可以为用户提供分布式编译的服务。用户可以将待编译的文件(例如程序的源代码)发送给客户端。客户端可以通过编译任务的形式将待编译的文件发送给服务端。在一些实施例中,客户端可以对程序的源代码进行预处理,并将预处理后的编译单元发送给服务端进行编译。
60.该编译任务可以包括第一子任务。应理解,一个编译任务可以包含任意数量的子任务。第一子任务可以是编译任务对应的多个子任务中的任意一个子任务。例如,待编译的目标程序包括5个文件。可以将编译每个文件的任务分解为一个子任务。应理解,子任务可能的分配方式有多种,本公开对子任务实际分配方式不做限定,只要子任务的分配能够应
用于分布式编译中即可。
61.在步骤s220,获取编译集群中每台执行机的负载信息。编译集群可以指用于分布式编译的执行机的集合。编译集群中的执行机可以是物理机也可以是弹性云主机,本公开对编译集群中执行机的具体形式不做限定。
62.在一些实施例中,编译集群中的执行机可以都由物理机组成。在另一些实施例中,编译集群中的执行机可以都由弹性云主机组成。在又一些实施例中,编译集群中的执行机可以由物理机和弹性云主机共同组成。编译集群不同的部署方式将在后文进行详细介绍。
63.编译集群中可以包括第一执行机。应理解,编译集群中可以包含任意数量的执行机。使用第一执行机仅为了便于描述。第一执行机可以指编译集群中的任意一台执行机。
64.执行机的负载信息可以包括多种维度的信息。例如,负载信息可以包括执行机的cpu占用率、内存占用率等。在一些实施例中,执行机的负载信息可以是执行机的实时负载信息。根据前文可知,编译过程中负载信息的变化较大。通过收集执行机的实时负载信息,可以更好地分析每个执行机上的负载情况,提升负载均衡的效果。
65.第一执行机的负载信息可以通过多种方式获取。例如,可以由服务端主动从第一执行机上获取。又如,可以由第一执行机主动向服务端上报负载信息。在一些实施例中,第一执行机主动上报的负载信息中还可以包括第一执行机的ip地址。通过由执行机主动上报ip地址,服务端可以不必提前配置当前编译集群中执行机的ip地址,配置简单。服务端可以动态地根据上报的ip地址进行负载均衡,因此,可以根据需要动态地进行编译集群的扩缩容。
66.可以通过多种方式由第一执行机上报负载信息。作为一个示例,可以在第一执行机上部署用于上报负载信息的上报组件。上报组件也可以称为上报工具。上报组件可以使用现有的负载上报工具,例如loadavg。然而,loadavg只能表示某一时刻的负载。对于编译这类负载实时变化较大的程序而言,现有工具提供的负载上报功能通常无法很好地用于负载均衡。因此,也可以根据需求自行编写上报负载信息的上报组件。上报组件可以通过多种方式编写完成,例如,可以利用脚本语言编写。脚本语言开发难度低、速度快、部署简单。可以利用任意类型的脚本语言编写上报工具。例如,可以使用python语言或go语言编写上报工具。
67.在步骤s230,根据负载信息从编译集群中选择用于执行第一子任务的执行机。
68.可以利用多种方式根据负载信息从编译集群中选择用于执行第一子任务的执行机。例如,可以按照负载信息对编译集群中的执行机进行排序,选择负载最小的执行机作为用于执行第一子任务的执行机。又如,可以对执行机的负载信息进行权重计算,根据权重信息选择用于执行第一子任务的执行机。
69.应理解,不同的子任务编译占用的时长和负载不同。权重计算时除了计算负载信息外,还可以计算其他相关的信息。例如,可以将当前执行机上分发的子任务的编译时长等作为权重计算的参数。利用负载的权重信息进行负载均衡,可以使编译任务更加平均地在各个执行机上分配,从而使得编译任务的总时长最短,以满足项目对编译速度(效率)的需求。
70.通过在服务端利用编译集群中执行机的负载信息对分布式编译做负载均衡,可以使得负载均衡的效果更优,从而进一步提升分布式编译的效率,以满足对编译效率的需求。
71.在一些实施例中,服务端可以包括反向代理。利用反向代理对编译集群进行负载均衡处理,可以使编译集群中的执行机相对于客户端是透明的。透明可以指客户端不区分编译集群中的执行机。客户端可以通过反向代理将编译任务向编译集群中的执行机下发。通过设置反向代理,可以简化客户端的配置。例如,编译集群扩缩容时,客户端可以不必进行任何适配性的修改。由于客户端侧无需额外感知后端服务。因此,客户端侧配置简单,使用方便。
72.反向代理可以通过多种方式实现。例如,可以自行开发用于根据执行机的负载信息分配编译任务的工具或组件。由于现有技术中已有许多成熟的反向代理工具,在一些实施例中,也可以直接使用现有的反向代理工具实现反向代理,以降低部署难度,提高部署效率。
73.在一些实施例中,反向代理可以包括nginx。nginx是一款高性能的http和反向代理web服务器。nginx稳定性高、功能集丰富、配置简单且系统资源消耗低。nginx提供开源版本。利用nginx作为反向代理服务器,使用成本低,收益高。
74.nginx仅能提供简单的负载均衡。为了提高负载均衡的性能,在一些实施例中,可以增加可被nginx调用的负载均衡组件。利用负载均衡组件和nginx共同实现高效的分布式编译负载均衡调度。
75.在一些实施例中,负载均衡组件可以使用lua脚本编写。lua是一个简洁、轻量、可扩展的脚本语言,也是号称性能最高的脚本语言。通过nginx和lua脚本的结合,可以无侵入nginx的源码,简单地对nginx的功能进行扩展。因此,实现简单,使用成本低。
76.在一些实施例中,可以提供多个nginx入口。每个nginx可以部署在不同的装置上。通过部署多个nginx,可以提高反向代理服务的稳定性,防止由于机器故障等问题导致的分布式编译失败等问题。
77.在一些实施例中,服务端还可以包括服务发现组件。执行机可以先将负载信息上报给服务发现组件。服务发现组件可以用于收集和存储编译集群中每台执行机上报的负载信息。服务发现组件可以利用任意的工具实现。例如,服务发现组件可以包括以下工具中的至少一种:etcd、redis以及zookeeper。
78.利用服务发现组件收集和存储执行机的负载信息,可以保证存储安全性,防止数据丢失。且现有技术中已有许多成熟的服务发现工具,通过复用现有工具,可以更方便地部署,缩短开发周期,提高部署效率。
79.前文提及执行机的部署,下面对执行机的具体部署方式进行介绍。执行机可以通过多种不同的方式部署。例如,执行机可以全部通过物理机部署。又如,执行机可以全部通过弹性云主机部署。又如,执行机可以由物理机和弹性云主机组合部署。
80.应理解,一个程序在开发的过程中,通常有不同的开发阶段。例如,开发阶段可以包括研发、测试、迭代和发版等。不同的开发阶段对编译的需求存在差异。例如,有些开发阶段可能需要频繁地执行编译操作,有些开发阶段相对而言执行编译操作的频率较低。
81.由于弹性云主机可以快速方便地进行增减。因此,通过使用物理机和弹性云主机组合的形式部署执行机,可以根据项目对编译的实际需求动态地对执行机进行扩缩容。编译集群的扩容例如可以指增加编译集群中执行机的数量。编译集群的缩容例如可以指减少编译集群中执行机的数量。
82.通过动态对编译集群动态扩缩容,可以动态匹配当前的项目需求。例如,可以根据项目的最低编译需求部署对应数量的物理机。当项目对编译的需求量增大时,可以根据项目需求增加匹配项目需求的弹性云主机。
83.可以理解,短时间使用的情况下,弹性云主机相对于物理机而言成本更低。通过物理机和弹性云主机的组合部署,可以降低编译集群的部署成本,动态满足项目不同开发阶段对编译的需求。
84.在一些实施例中,可以通过容器部署执行机。容器例如可以指docker容器。容器部署实现简单,无需额外配置,能根据实际需求快速对编译集群进行扩缩容,以动态满足项目开发需求。
85.根据前文可知,distcc是一款开源的分布式编译工具。在一些实施例中,本公开提供的分布式编译方法可以应用于distcc工具中。例如,本公开实施例提供的服务端可以与distcc客户端通信,以接收distcc客户端发送的分布式编译任务,并通过服务端提供的负载均衡方法将distcc客户端发送的分布式编译任务分发给编译集群中的执行机,以提高distcc的负载均衡效果,提升distcc分布式编译工具的编译效率。
86.上文结合图1至图2,详细描述了本公开的方法实施例,下面结合图3至图6,详细描述本公开的装置实施例。应理解,方法实施例的描述与装置实施例的描述相互对应,因此,未详细描述的部分可以参见前面方法实施例。
87.图3是本公开一实施例提供的分布式编译系统的结构示意图。该分布式编译系统应用于服务端。如图3所示,分布式编译系统300可以包括接收组件310、获取组件320以及选择组件330。下面分别对每个组件进行介绍。
88.接收组件310可以被配置为接收客户端发送的待编译文件的编译任务,其中,所述编译任务包括第一子任务。
89.获取组件320可以被配置为获取编译集群中每台执行机的负载信息。在一些实施例中,编译集群可以包括第一执行机,获取组件320可以包括上报组件,上报组件可以被配置为上报第一执行机的负载信息。
90.在一些实施例中,上报组件可以部署在第一执行机上,以实时地监控和上报第一执行机的负载信息。上报组件可以通过多种方式实现,例如,上报组件可以使用python脚本语言编写并部署在第一执行机上。部署的方式可以有多种。例如,可以通过容器(例如docker)进行部署。容器部署实现简单,部署效率高。因此,通过容器部署的方式,可以方便地对编译集群进行扩缩容,以动态满足项目开发对编译的实际需求。
91.在一些实施例中,获取组件320还可以包括服务发现组件。服务发现组件可以被配置为收集和存储上报组件上报的所述负载信息。负载信息例如可以包括执行机的cpu占用率等。
92.服务发现组件例如可以使用一下工具中的至少一种:etcd、redis以及zookeeper。作为一个示例,服务发现组件可以使用etcd服务发现工具。etcd是一款服务发现稳定的开源服务发现工具。使用etcd可以降低实现成本。
93.选择组件330可以被配置为根据负载信息从编译集群中选择用于执行第一子任务的执行机。
94.通过充分利用执行机的负载信息选择用于执行子任务的执行机,可以提升编译效
率。通过在服务端对分布式编译任务进行负载均衡,可以使客户端不必识别编译集群中的执行机,以简化客户端的配置,实现高效的水平方向负载均衡。
95.在一些实施例中,选择组件330可以包括反向代理服务器。反向代理服务器可以包括nginx。在一些实施例中,nginx还可以兼任接收组件310的功能。例如,nginx可以用于接收客户端发送的待编译文件的编译任务,以及根据负载信息从编译集群中选择用于执行编译任务中的第一子任务的执行机。
96.在一些实施例中,选择组件330还可以包括负载均衡组件。负载均衡组件可以被nginx调用。负载均衡组件可以用于根据负载信息从编译集群中选择用于执行所述第一子任务的执行机。负载均衡组件可以通过多种方式实现。作为一个示例,可以利用lua脚本编写负载均衡组件。nginx可以调用lua脚本,以根据lua脚本的执行规则完成分布式编译的负载均衡。
97.可以通过多种方式进行负载均衡。例如,可以根据编译集群中执行机的cpu占用率选择用于执行第一子任务的执行机。又如,可以根据编译集群中执行机的cpu占用率以及该执行机上已分配的子任务的执行情况,选择用于执行第一子任务的执行机。
98.通过负载均衡脚本对编译集群中的执行机的负载信息进行分析,可以根据实际的编译需求进行负载均衡,从而进一步提升分布式编译的编译效率。
99.在一些实施例中,nginx可以包括多个入口。即,nginx服务可以部署在多台装置上。通过部署多台nginx,当某一台nginx出现故障后,其他nginx入口可以继续使用,以保障提供高可用高可靠的分布式编译环境。
100.在一些实施例中,获取组件320和选择组件330可以部署在不同的装置上。将获取组件320和选择组件330部署在不同的装置上,可以防止服务间相互影响。当分布式编译系统出现故障时,可以快速定位到问题的根因,从而提高解决系统故障的效率。
101.图4是本公开又一实施例提供的分布式编译系统的结构示意图。图4所示的分布式编译系统是在distcc工具的基础上的改进。
102.如图4所示,distcc工具包括distcc客户端410和distccd服务。distccd通常部署在编译集群的每台执行机上。可以在distcc客户端410上配置开启了distccd服务的执行机的ip地址,配置方式可以参见前文。程序的编译任务可以包括第一子任务。distcc客户端在执行分布式编译时,会随机或顺序地从配置好的ip列表中选择一个用于执行第一子任务的执行机。
103.为了提高distcc工具的负载均衡效果,可以在distcc客户端410与编译集群430之间增加反向代理420。反向代理420例如可以为nginx服务器。
104.nginx服务器可以通过tcp套接字(例如3632端口)与distcc客户端410通信。tcp套接字是无状态通信,不存在断线重连等场景。对于安全性要求不高的编译场景,使用tcp套接字进行通信,通信效率高、通信连接稳定,因此,可以进一步提升分布式编译的编译效率。
105.nginx服务器可以接收distcc客户端410发送的编译请求(或编译任务),并将编译任务下发给编译集群中的执行机。可以通过修改distcc_hosts环境变量配置nginx服务器。例如,可以使用export distcc_hosts="host0/100"为distcc客户端配置nginx服务器。其中,host0表示nginx服务器所在的装置的ip地址。
106.由上述配置方式可以看出,使用反向代理服务器,客户端仅需配置该服务器对应
的ip地址,即可实现分布式编译,配置简单,使用方便。
107.在一些实施例中,可以为nginx服务器编写负载均衡组件。负载均衡组件可以使用lua脚本编写。nginx服务器可以直接调用lua脚本,以扩展nginx服务器的功能,而无需侵入nginx的源码。因此,在nginx服务器的基础上增加lua脚本,实现简单。
108.在一些实施例中,编译任务可以包括第一子任务。负载均衡组件可以获取编译集群中每台执行机的负载信息,并根据负载信息选择用于执行第一子任务的执行机。负载均衡组件可以通过多种方式获取编译集群中每台执行机的负载信息。例如,负载均衡组件可以直接从编译集群的每台执行机上读取该执行机的负载信息。
109.又如,分布式编译系统可以包括服务发现组件440。服务发现组件440可以收集和存储编译集群中每台执行机的负载信息。负载均衡组件可以从服务发现组件440处读取负载信息,或接收服务发现组件440上报的负载信息。
110.在一些实施例中,nginx服务器和服务发现组件440可以部署在不同的电子设备上。例如,可以分别为nginx服务器和服务发现组件440分配不同的计算机。通过将收集和存储执行机的负载信息与利用负载信息进行负载均衡两种服务分离,可以使负载均衡处理与负载信息相互独立,以提高系统的可用性。例如,nginx服务器出现故障重启后,可以利用负载均衡组件从服务发现组件440处读取编译集群的负载信息,以迅速恢复分布式编译功能,缩短编译服务的故障恢复时间。
111.编译集群430可以包括任意数量的执行机(例如执行机431~执行机43n)。每台执行机可以是任意类型的执行机。在一些实施例中,编译集群430可以包括物理机和弹性云主机。通过使用物理机和弹性云主机的组合,可以使该分布式编译系统具备弹性的计算能力,以根据实际的编译需求动态调整执行机的数量,从而兼顾成本和编译效率。
112.在一些实施例中,每台执行机的负载信息可以由执行机主动上报。例如,可以在每台执行机上部署一个监控组件。在本实施例中,方案应用于distcc分布式编译工具。因此,监控组件也可以称为dissccm或distcc-monitor。
113.监控组件可以用于监控执行机的实时负载信息,并将负载信息上报给服务发现组件440。上报的负载信息可以包括执行机的cpu占用率、内存占用率、ip等。
114.在一些实施例中,负载信息还可以包括负载亲和度。负载亲和度也可以称为cpu亲和度、cpu亲和性或cpu关联性。负载亲和可以指运行在多核处理器上的进程,在指定的cpu上执行尽量长的时间而不被迁移到其他cpu上。通过监控负载亲和度,可以精确到物理核心数的负载,使负载均衡更加精确,从而避免编译大单元的情况。
115.通过由监控组件主动向服务发现组件440上报负载信息,可以动态调整执行机的数量,而无需修改服务发现组件440或反向代理420的配置。为了便于理解,以反向代理420包括nginx、负载均衡组件为例,介绍本方案简化配置的原理。
116.编译集群430中的执行机部署了监控组件后,可以主动向服务发现组件440上报自己的ip地址和负载信息。负载均衡组件可以从服务发现组件440处读取存储的执行机的ip地址和负载信息,根据负载信息选择用于执行第一子任务的ip地址,并将该ip地址配置到nginx中。nginx将第一子任务下发给负载均衡组件配置的ip地址对应的执行机上。通过上述方法,编译集群的扩缩容可以动态执行,无需修改服务发现组件440或nginx的配置,以实现自动化的扩缩容。
117.在一些实施例中,执行机可以通过容器(例如docker)部署。例如,可以将分布式编译所需的服务或程序(例如distccd和distccm)生成容器。利用该容器部署执行机。利用容器进行执行机的部署,可以进一步简化编译集群扩缩容处理,并且提升执行机的部署效率。
118.在一些实施例中,编译集群中的执行机可以与其他服务混合部署。例如,编译集群中的执行机可以复用poc环境或测试环境的执行机,以节约资源,降低部署成本。
119.继续参见图4,分布式编译系统还可以包括服务发现组件440。服务发现组件440例如可以通过etcd服务实现。etcd是一个基于raft的分布式一致性kv存储器。etcd可以提供非常稳定的服务。
120.etcd可以记录执行机上distccm上报的负载信息。通过将负载信息记录到etcd,可以标记当前distcc的服务信息。因此,etcd可以充当服务发现角色。
121.在一些实施例中,可以提供可视化的负载信息。例如,可以将etcd中存储的执行机的负载信息打印出来。通过提供可视化的负载信息,可以便于运维人员对编译服务进行精确的监控,提高服务质量。
122.图5是本公开又一实施例提供分布式编译系统的结构示意。如图5所示,反向代理520可以有多个入口(例如入口1~n)。反向代理入口的数量可以根据实际需求设置。在一些实施例中,可以设置两个反向代理服务器,以兼顾成本和稳定性。
123.图6是本公开一实施例提供的客户端视角的分布式编译系统的结构示意图。图6以distcc分布式编译工具为例。如图6所示,对于distcc客户端,后台的执行机相当于仅有一台(执行机620)。因此,distcc客户端侧配置简单。
124.本公开提供的分布式编译方案,摆脱了在客户端侧进行负载均衡。通过反向代理实现负载均衡,降低了分布式编译配置的复杂度,提高配置效率。通过服务水平扩展,使编译集群可以实现快速扩缩容,以动态满足实际的编译需求,从而兼顾编译效率和成本。实践中,本公开实施例提供的方案可以将编译效率提升至少3倍。
125.在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其他任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行所述计算机程序指令时,全部或部分地产生按照本公开实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(digital subscriber line,dsl))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质(例如,软盘、硬盘、磁带)、光介质(例如数字视频光盘(digital video disc,dvd))、或者半导体介质(例如固态硬盘(solid state disk,ssd))等。
126.本领域普通技术人员可以意识到,结合本公开实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每
个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本公开的范围。
127.在本公开所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
128.所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
129.另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
130.以上所述,仅为本公开的具体实施方式,但本公开的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应以所述权利要求的保护范围为准。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献