为什么需要分布式编译?
大型项目过长的编译耗时给开发、调试、测试和CI/CD都带来延迟,缩短大型项目的编译时间是分布式编译系统的主要目标。
- 使用分布式编译系统编译项目可以利用计算机集群提高编译效率,缩短项目编译时间。
- 在实际开发时,同一个团队有大量编译任务是相同的,分布式编译缓存可以避免重复编译,从而节约算力消耗,并进一步缩短项目编译时间。
分布式编译技术相关工作综述
当前,国内外已有多种分布式编译系统和技术,如Distcc[8]、 CCache[9]、Bazel[10]、CodeArts Build[11]以及YADCC[12]等。
Distcc是一款经典的分布式编译工具,采用客户端/服务器的工作模式,用户使用客户端程序启动编译任务,客户端会分析项目代码并在本地完成预处理工作,然后选择一台远程计算机,将文件发送至服务器,服务器进程处理收到的编译任务并将结果返回至客户端。Distcc 的缺点在于其负载均衡算法过于简单,其无法感知各个远程计算机的负载情况,任务分发的依据主要与远程主机在本地环境变量中的次序相关,远程主机名越靠前,得到的编译任务越多,但是当存在某个远程主机的性能过差的情况,整体编译效率将会显著下降。
CCache(Compiler Cache)是一款编译缓存工具,支持GCC、Clang、MSVC(Microsoft Visual C++)等编译器。其原理是将源代码文件的编译结果保存在文件缓存中,在后续编译过程中再次使用到对应文件且该文件无变动时,可直接从缓存中获取编译结果。CCache的效果类似于Make的缓存功能,不同的是Make是根据源文件的时间戳来实现缓存,而CCache是按文件内容实现缓存,通过计算文件内容的哈希值来标识该缓存文件。有了编译缓存CCache的支持,软件项目能够在无入侵,不影响现有业务代码,对开发人员透明的前提下提高编译效率。CCache的缺点是只能实现本地机器的缓存共享,无法对多个远程计算机提供编译缓存服务。
Bazel是Google内部编译工具Blaze的开源实现,同时支持多种编程语言。其采用的客户端/服务器模式,可以将任务方便地扩展到多台服务器上进行分布式编译。Bazel的编译指令采用了类似Python的Starlark语言[13]作为领域特定语言DSL[14](domain special language),而且支持细粒度的编译产物管理,使得项目互相引用变得十分简单。虽然Bazel 拥有执行速度快、跨平台、可扩展等优点,但Bazel 运行的前提条件是需要开发人员手动编写依赖描述文件,即BUILD文件。这样也就意味着在代码规模稍大的项目中引入Bazel需要消耗时间精力编写BUILD文件,对于非Bazel项目极其不友好。
华为云CodeArts Build已经可以支持华为6万研发人员进行软件开发工作和软件高效集成,每日编译任务量达到77万次,并提供24.8万台服务器进行集中的弹性调度。但CodeArts Build是专为华为云平台设计的,因此它的使用会对华为云服务的依赖性较高,同时由于其非开源,用户无法直接了解该系统的具体实现细节和内部工作原理,对后续的优化和维护工作带来不便。
腾讯YADCC(Yet Another Distributed C/C++ Compiler)是腾讯云推出的一款基于分布式架构的C/C++ 编译器。它采用了分布式编译技术和增量编译技术,可以快速地编译大型C/C++项目,并支持多种编译选项和优化级别。除了分布式编译外,YADCC还提供分布式编译缓存、调度预取优化、并发控制等服务。但由于YADCC的调度器是全局共享的,所有请求均由调度节点统一分配,因此集群在高负载时会阻塞新请求,导致用户无法正常使用服务。而且YADCC主要用于C/C++项目,因为使用范围有限。
结合国内外现状可以发现,大多数分布式编译系统都是针对C/C++相关项目,对于像Android开源项目、开源鸿蒙等复杂的多语言大型项目的支持能力不足。
CloudBuild/ShareBuild分布式编译系统
CloudBuild/ShareBuild分布式编译系统实现了基于Ninja的高效分布式编译,实验表明,采用本分布式编译系统后AOSP项目的编译时间降低了57.4%,LLVM项目降低了72.4%,OpenCV项目降低了71.6%,因此本系统可以大幅缩短编译时间,加快项目迭代速度。

参考链接
- [1] Google. Android开源项目[EB/OL]. https://source.android.google.cn,2021.
- [2] Evan Martin. The ninja build system[EB/OL]. 2022. https://ninja-build.org/manual.html.
- [3] 王淼. 面向多核处理器的并行编译及优化关键技术研究[D]. 长沙: 国防科学技术大学, 2010.
- [4] 崔洋洋. 分布式计算综合实验平台的设计与实现[D]. 西安电子科技大学, 2021.
- [5] 童亚拉. 分布式编译的方法和系统研究[J]. 计算机技术与发展, 2010, 20(5): 79-8.
- [6] 张朝滨. 基于Ninja的分布式编译系统[D]. 中山大学, 2015.
- [7] Nacke, Kai. Learn llvm 12: A beginner’s guide to learning llvm compiler tools and core libraries with c++[M]. Packt Publishing Ltd, 2021: 30 - 34.
- [8] Matev, Rosen. Fast distributed compilation and testing of large c++ projects[C]//EPJ Web of Conferences. USA: EDP Sciences, 2020: 3-5.
- [9] Joel Rosdahl. Ccache—a fast c/c++ compiler cache[EB/OL]. 2023. h-ttps://ccache.dev.
- [10] Google. Bazel官方文档[EB/OL]. 2022. https://bazel.build/start/baz-elintro.
- [11] HuaWei. 编译构建 CodeArts Build[EB/OL]. https://www.huaweicloud.com/product/cloudbuild.html,2023.
- [12] Tencent. Yadcc 分布式C++编译器[EB/OL]. 2022. https://github.com/Tencent/yadcc.
- [13] Google. Starlark language[EB/OL]. 2022. https://bazel.build/rules/language.
- [14] 廖万斌, 曹云峰, 王新尧. 面向复杂系统需求分析的 DSL 构建[J]. 系统工程与电子技术, 2022, 44(11): 3443-3454.
- [15] Jing, Shimin, Zheng, Xin, Chen, Zhengwen. Review and investigation of merkle tree’s technical principles and related application fields[C/OL]//2021 International Conference on Artificial Intelligen-ce, Big Data and Algorithms (CAIBDA). Xi’an, China: IEEE, 2021: 86-90. DOI:10.1109/CAIBDA53561.2021.00026.
- [16] Rawal, Bharat S, Kumar, Lingampally Shiva AND Maganti, Sriram AND Godha, Varun. Comparative study of sha-256 optimization techniques[C]//2022 IEEE World AI IoT Congress (AIIoT). Seattle, WA, USA: IEEE, 2022: 387-392.
