From dcd05056dbc0f01b108abf8f6b048055026536e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E5=AE=81?= Date: Thu, 4 Dec 2025 06:05:48 +0000 Subject: [PATCH 1/8] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20src/compile/sharebuild?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/compile/sharebuild.md | 143 +++++++++++++++++--------------------- 1 file changed, 64 insertions(+), 79 deletions(-) diff --git a/src/compile/sharebuild.md b/src/compile/sharebuild.md index b42507d..ab24881 100644 --- a/src/compile/sharebuild.md +++ b/src/compile/sharebuild.md @@ -1,79 +1,64 @@ -# 分布式编译系统ShareBuild -![alt text](/public/compile/promotional-graphic-cloudbuild.jpg) -## 为什么需要分布式编译? -- 大型项目过长的编译耗时将会给开发、测试和调试都带来延迟,所以缩短大型项目的编译时间的分布式编译系统有重要意义 -- 使用分布式编译系统编译项目可以利用计算机集群提高编译效率,缩短项目编译时间 -- 在实际开发时,同一个团队大量的编译任务时相同的。CloudBuild提供的编译缓存可以避免重复上传和重复编译,从而进一步加快编译效率 - -## 总体架构 -### 系统总体架构 -![alt text](/public/compile/architecture.png) -- Ninja:客户端,该机器上需要保存有完整的待编译项目源代码。 -- Action Cache:服务端缓存,主要保存编译任务的执行结果。 -- CAS Cache:服务端缓存,主要保存客户端上传的依赖文件,编译结果文件。 -- Scheduler:任务调度器,将编译任务id分发到各个编译节点。 -- Redis:主要存储具体的编译任务供编译节点领取执行,也可存储Action Cache和 CAS Cache中的内容加速编译。 -- MySQL:主要存储编译过程中的任务统计信息。 -- Executor:各个编译节点 - -### 部署示意图 -![alt text](/public/compile/system-diagram.png) -CloudBuild主程序分为三个部分:Client、Server、Executor。 -- Client:运行在客户端,和用户对接,用于生成待执行的远程编译任务, 同时也作为本地编译节点执行本地任务。 -- Server:运行在主服务器,主要用于连接各个编译节点,以及 将客户端上传的编译任务调度到与其连接的各个编译节点上。 -- Executor:运行在编译节点,负责接收并执行编译任务,是编译任务真正执行的地方。 - -### 系统分层结构 -![alt text](/public/compile/layered-system-architecture.png) - -## 运行原理与流程 - -### 分布式编译原理 -![alt text](/public/compile/compiler-principles.png) - -### CloudBuild客户端 -CloudBuild客户端基于Ninja改造,有下面这些优势 -- 兼容使用Ninja编译的项目 -- 使用远程执行的方式提高编译时并发度 -- 使用编译缓存减少需要编译的任务数量 - -### CloudBuild服务端 -- 使用远程执行的方法提高编译时并发度,实现了任务分发至远程节点同步执行 -- 使用分布式任务调度提高任务调度效率和计算节点资源利用率,避免集中式调度的任务阻塞问题 -- 使用编译缓存结合内容寻址存储技术减少网络传输量、避免重复上传与重复编译 - -### CloudBuild优势 -- 低成本:组成executor的机器不需要使用专门的高性能计算型机器,可使用多个平价的空闲机器 -- 高效:CloudBuild实现分布式编译的功能,相比单机大大提升并发度 -- 兼容Ninja:CloudBuild客户端基于Ninja改造,对于使用Ninja构建和可以转换为Ninja构建的项目不用额外修改构建清单 - -### CloudBuild执行流程 -- 客户端: 生成远程任务->生成任务依赖->发送任务与依赖 -- 服务端:检查任务缓存->检查依赖完整性->调度任务 -- 编译结点:还原文件目录->还原文件目录->返回编译结果 - -## AOSP和LLVM上的应用 -### LLVM上的应用效果 -![alt text](/public/compile/table1.png) -### AOSP上的应用效果 -![alt text](/public/compile/table2.png) -### CloudBuild硬件资源利用率 -4核CPU利用率: -![alt text](/public/compile/CPU-utilization-4.png) -8核CPU利用率: -![alt text](/public/compile/CPU-utilization-8.png) -16核CPU利用率: -![alt text](/public/compile/CPU-utilization-16.png) - -## CloudBuild使用方法 -### CloudBuild安装 -![alt text](/public/compile/cloudbuild-installation.png) -CloudBuild项目地址:https://gitee.com/cloudbuild888/cloudbuild.git -### CloudBuild分布式编译 -![alt text](/public/compile/cloudbuild-distributed-compilation.png) -LLVM项目地址:https://gitee.com/mirrors/LLVM.git - - - - - +# ShareBuild分布式共享编译工作站 + +## ShareBuild的适用场景 + +在同一局域网内工作的小型团队,ShareBuild以P2P共享架构将空闲算力贡献给团队其他成员,从而为每个团队成员提供编译加速效果。 + +## ShareBuild QuickStart + +* 同一个局域网内的A、B、C等所有节点上安装ninja2: + +``` +wget -c https://raw.githubusercontent.com/ninja-cloudbuild/ninja2/refs/heads/main/install.sh && chmod +x install.sh && sudo ./install.sh +``` + +* 启用ShareBuild的前置要求(二选一即可) + + 1. 所有节点上均安装配置好了项目的编译环境,即所有节点上均能采用ninja成功单机编译项目。 + 2. 选择任一节点上作为项目开发环境,项目中使用.devcontainer/devcontainer.json 配置了image镜像(示例如下),依次镜像创建的开发容器中能采用ninja成功单机编译项目。 + +``` + { + "name": "DevContainer", + "image": "devstar.cn/devstar/DevContainer:latest" # 仅作示例,务必使用您已安装配置好项目编译环境的容器镜像! + } +``` + +* 选择任一节点上作为项目开发环境,开启ShareBuild模式,然后进行分布式编译。 + +项目根目录下创建ninja2.conf 文件如下即可开启ShareBuild模式: +``` +sharebuid:true +``` +这时使用ninja编译将自动进入ShareBuild模式分布式编译项目。 + +> 如果直接使用ninja命令编译项目,也可以加上-s参数表示启用ShareBuild模式,示例如下: +``` +ninja -s -r `realpath ../` #启动分布式编译,注意-r 指定项目根目录 +ninja -t clean #清除编译产物 +```` + +* 对一些特殊项目的补充说明 + +除以上常规的ShareBuild配置外,对于一些特殊项目需要做一些额外的配置,补充说明如下: + +## 使用ShareBuild编译Android开源项目(AOSP) + +除按照以上方法准备好编译环境和开启ShareBuild模式外,以AOSP14项目为例,还需要替换ninja和准备.sharebuild.yml来过滤掉一些无法远程编译的命令,具体操作如下: + +``` +cp /usr/bin/android_ninja prebuilts/build-tools/linux-x86/bin/ninja +cp /etc/ninja2/aosp14/.sharebuild.yml ./ +``` + +然后就可以单机编译一样使用make命令来分布式编译Android开源项目(AOSP)。 + +## 使用ShareBuild编译鸿蒙开源项目(OpenHarmony) + +todo + +## 版权声明 + +Copyright @ Mengning Software + +梦宁软件(江苏)有限公司 版权所有 \ No newline at end of file From a490b98cbaa2e13baa15a65546f8833ce2800ef2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E5=AE=81?= Date: Fri, 5 Dec 2025 01:16:41 +0000 Subject: [PATCH 2/8] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20src/compile/sharebuild?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/compile/sharebuild.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/compile/sharebuild.md b/src/compile/sharebuild.md index ab24881..390ecd1 100644 --- a/src/compile/sharebuild.md +++ b/src/compile/sharebuild.md @@ -12,9 +12,11 @@ wget -c https://raw.githubusercontent.com/ninja-cloudbuild/ninja2/refs/heads/main/install.sh && chmod +x install.sh && sudo ./install.sh ``` -* 启用ShareBuild的前置要求(二选一即可) +* 启用ShareBuild的前置要求 1. 所有节点上均安装配置好了项目的编译环境,即所有节点上均能采用ninja成功单机编译项目。 + * 选择任一节点上作为项目开发环境,开启ShareBuild模式,然后进行分布式编译。 @@ -52,11 +56,11 @@ cp /etc/ninja2/aosp14/.sharebuild.yml ./ ``` 然后就可以单机编译一样使用make命令来分布式编译Android开源项目(AOSP)。 - + ## 版权声明 Copyright @ Mengning Software From 3870b9720b5433d392a9b8cf7ac4ad79c9417967 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E5=AE=81?= Date: Fri, 5 Dec 2025 02:00:24 +0000 Subject: [PATCH 3/8] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E6=95=B4=E7=90=86?= =?UTF-8?q?=E7=9A=84=E7=BC=96=E8=AF=91=E5=8A=A0=E9=80=9F=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vitepress/config.mts | 4 +- src/compile/cloudbuild.md | 16 ++--- src/compile/index.md | 76 ++++-------------------- src/compile/sharebuild-aosp14.md | 68 +++++++++++++++++++++ src/compile/sharebuild.md | 8 ++- src/compile/why-distributed-compiling.md | 73 ++--------------------- 6 files changed, 100 insertions(+), 145 deletions(-) create mode 100644 src/compile/sharebuild-aosp14.md diff --git a/.vitepress/config.mts b/.vitepress/config.mts index 32d8911..29bf853 100644 --- a/.vitepress/config.mts +++ b/.vitepress/config.mts @@ -271,11 +271,11 @@ function sidebarCompiling(): DefaultTheme.SidebarItem[] { link: '/src/compile/why-distributed-compiling' }, { - text: 'CloudBuild', + text: 'CloudBuild分布式编译', link: '/src/compile/cloudbuild' }, { - text: 'ShareBuild', + text: 'ShareBuild共享编译', link: '/src/compile/sharebuild' }, ] diff --git a/src/compile/cloudbuild.md b/src/compile/cloudbuild.md index 01e45ad..1f66334 100644 --- a/src/compile/cloudbuild.md +++ b/src/compile/cloudbuild.md @@ -1,11 +1,13 @@ -# 分布式编译系统CloudBuild -![alt text](/public/compile/promotional-graphic-cloudbuild.jpg) -## 为什么需要分布式编译? -- 大型项目过长的编译耗时将会给开发、测试和调试都带来延迟,所以缩短大型项目的编译时间的分布式编译系统有重要意义 -- 使用分布式编译系统编译项目可以利用计算机集群提高编译效率,缩短项目编译时间 -- 在实际开发时,同一个团队大量的编译任务时相同的。CloudBuild提供的编译缓存可以避免重复上传和重复编译,从而进一步加快编译效率 +# CloudBuild私有云分布式编译系统 + +## CloudBuild的适用场景 + +对于大型开发团队,CloudBuild私有云分布式编译系统不仅可以通过分布式编译加速项目编译过程,而且有大量编译任务是相同的,分布式编译缓存可以避免重复编译,从而节约算力消耗,并进一步缩短项目编译时间。 + +## CloudBuild QuickStart + +todo -## 总体架构 ### 系统总体架构 ![alt text](/public/compile/architecture.png) - Ninja:客户端,该机器上需要保存有完整的待编译项目源代码。 diff --git a/src/compile/index.md b/src/compile/index.md index c18552c..8e4091a 100644 --- a/src/compile/index.md +++ b/src/compile/index.md @@ -1,80 +1,24 @@ # 编译加速 -## 分布式编译技术 +## 分布式编译 ![alt text](/public/compile/promotional-graphic-cloudbuild.jpg) -- 大型项目过长的编译耗时将会给开发、测试和调试都带来延迟,所以缩短大型项目的编译时间的分布式编译系统有重要意义 -- 使用分布式编译系统编译项目可以利用计算机集群提高编译效率,缩短项目编译时间 -- 在实际开发时,同一个团队大量的编译任务时相同的。CloudBuild提供的编译缓存可以避免重复上传和重复编译,从而进一步加快编译效率 +- [为什么需要分布式编译?](/src/compile/why-distributed-compiling) +- [CloudBuild私有云分布式编译系统](/src/compile/cloudbuild) +- [ShareBuild分布式共享编译工作站](/src/compile/sharebuild) + - [以AOSP14项目为例ShareBuild分布式编译详细配置方法](/src/compile/sharebuild-aosp14) -### CloudBuild -![alt text](/public/compile/architecture.png) -- Ninja:客户端,该机器上需要保存有完整的待编译项目源代码。 -- Action Cache:服务端缓存,主要保存编译任务的执行结果。 -- CAS Cache:服务端缓存,主要保存客户端上传的依赖文件,编译结果文件。 -- Scheduler:任务调度器,将编译任务id分发到各个编译节点。 -- Redis:主要存储具体的编译任务供编译节点领取执行,也可存储Action Cache和 CAS Cache中的内容加速编译。 -- MySQL:主要存储编译过程中的任务统计信息。 -- Executor:各个编译节点 -### ShareBuild -![alt text](/public/compile/system-diagram.png) -CloudBuild主程序分为三个部分:Client、Server、Executor。 -- Client:运行在客户端,和用户对接,用于生成待执行的远程编译任务, 同时也作为本地编译节点执行本地任务。 -- Server:运行在主服务器,主要用于连接各个编译节点,以及 将客户端上传的编译任务调度到与其连接的各个编译节点上。 -- Executor:运行在编译节点,负责接收并执行编译任务,是编译任务真正执行的地方。 +## AI编译器 -### 系统分层结构 -![alt text](/public/compile/layered-system-architecture.png) +todo -## 运行原理与流程 +## PGO/LTO编译性能优化 + +todo -### 分布式编译原理 -![alt text](/public/compile/compiler-principles.png) - -### CloudBuild客户端 -CloudBuild客户端基于Ninja改造,有下面这些优势 -- 兼容使用Ninja编译的项目 -- 使用远程执行的方式提高编译时并发度 -- 使用编译缓存减少需要编译的任务数量 - -### CloudBuild服务端 -- 使用远程执行的方法提高编译时并发度,实现了任务分发至远程节点同步执行 -- 使用分布式任务调度提高任务调度效率和计算节点资源利用率,避免集中式调度的任务阻塞问题 -- 使用编译缓存结合内容寻址存储技术减少网络传输量、避免重复上传与重复编译 - -### CloudBuild优势 -- 低成本:组成executor的机器不需要使用专门的高性能计算型机器,可使用多个平价的空闲机器 -- 高效:CloudBuild实现分布式编译的功能,相比单机大大提升并发度 -- 兼容Ninja:CloudBuild客户端基于Ninja改造,对于使用Ninja构建和可以转换为Ninja构建的项目不用额外修改构建清单 - -### CloudBuild执行流程 -- 客户端: 生成远程任务->生成任务依赖->发送任务与依赖 -- 服务端:检查任务缓存->检查依赖完整性->调度任务 -- 编译结点:还原文件目录->还原文件目录->返回编译结果 - -## AOSP和LLVM上的应用 -### LLVM上的应用效果 -![alt text](/public/compile/table1.png) -### AOSP上的应用效果 -![alt text](/public/compile/table2.png) -### CloudBuild硬件资源利用率 -4核CPU利用率: -![alt text](/public/compile/CPU-utilization-4.png) -8核CPU利用率: -![alt text](/public/compile/CPU-utilization-8.png) -16核CPU利用率: -![alt text](/public/compile/CPU-utilization-16.png) - -## CloudBuild使用方法 -### CloudBuild安装 -![alt text](/public/compile/cloudbuild-installation.png) -CloudBuild项目地址:https://gitee.com/cloudbuild888/cloudbuild.git -### CloudBuild分布式编译 -![alt text](/public/compile/cloudbuild-distributed-compilation.png) -LLVM项目地址:https://gitee.com/mirrors/LLVM.git diff --git a/src/compile/sharebuild-aosp14.md b/src/compile/sharebuild-aosp14.md new file mode 100644 index 0000000..390ecd1 --- /dev/null +++ b/src/compile/sharebuild-aosp14.md @@ -0,0 +1,68 @@ +# ShareBuild分布式共享编译工作站 + +## ShareBuild的适用场景 + +在同一局域网内工作的小型团队,ShareBuild以P2P共享架构将空闲算力贡献给团队其他成员,从而为每个团队成员提供编译加速效果。 + +## ShareBuild QuickStart + +* 同一个局域网内的A、B、C等所有节点上安装ninja2: + +``` +wget -c https://raw.githubusercontent.com/ninja-cloudbuild/ninja2/refs/heads/main/install.sh && chmod +x install.sh && sudo ./install.sh +``` + +* 启用ShareBuild的前置要求 + + 1. 所有节点上均安装配置好了项目的编译环境,即所有节点上均能采用ninja成功单机编译项目。 + + +* 选择任一节点上作为项目开发环境,开启ShareBuild模式,然后进行分布式编译。 + +项目根目录下创建ninja2.conf 文件如下即可开启ShareBuild模式: +``` +sharebuid:true +``` +这时使用ninja编译将自动进入ShareBuild模式分布式编译项目。 + +> 如果直接使用ninja命令编译项目,也可以加上-s参数表示启用ShareBuild模式,示例如下: +``` +ninja -s -r `realpath ../` #启动分布式编译,注意-r 指定项目根目录 +ninja -t clean #清除编译产物 +```` + +* 对一些特殊项目的补充说明 + +除以上常规的ShareBuild配置外,对于一些特殊项目需要做一些额外的配置,补充说明如下: + +## 使用ShareBuild编译Android开源项目(AOSP) + +除按照以上方法准备好编译环境和开启ShareBuild模式外,以AOSP14项目为例,还需要替换ninja和准备.sharebuild.yml来过滤掉一些无法远程编译的命令,具体操作如下: + +``` +cp /usr/bin/android_ninja prebuilts/build-tools/linux-x86/bin/ninja +cp /etc/ninja2/aosp14/.sharebuild.yml ./ +``` + +然后就可以单机编译一样使用make命令来分布式编译Android开源项目(AOSP)。 + +## 版权声明 + +Copyright @ Mengning Software + +梦宁软件(江苏)有限公司 版权所有 \ No newline at end of file diff --git a/src/compile/sharebuild.md b/src/compile/sharebuild.md index 390ecd1..1d4d1f3 100644 --- a/src/compile/sharebuild.md +++ b/src/compile/sharebuild.md @@ -48,7 +48,7 @@ ninja -t clean #清除编译产物 ## 使用ShareBuild编译Android开源项目(AOSP) -除按照以上方法准备好编译环境和开启ShareBuild模式外,以AOSP14项目为例,还需要替换ninja和准备.sharebuild.yml来过滤掉一些无法远程编译的命令,具体操作如下: +除按照以上方法准备好编译环境和开启ShareBuild模式外,以AOSP14项目为例([详细的配置方法](/src/compile/sharebuild-aosp14)),还需要替换ninja和准备.sharebuild.yml来过滤掉一些无法远程编译的命令,具体操作如下: ``` cp /usr/bin/android_ninja prebuilts/build-tools/linux-x86/bin/ninja @@ -56,11 +56,17 @@ cp /etc/ninja2/aosp14/.sharebuild.yml ./ ``` 然后就可以单机编译一样使用make命令来分布式编译Android开源项目(AOSP)。 + + +## 参考链接 + +* [以AOSP14项目为例ShareBuild分布式编译详细配置方法](/src/compile/sharebuild-aosp14) + ## 版权声明 Copyright @ Mengning Software diff --git a/src/compile/why-distributed-compiling.md b/src/compile/why-distributed-compiling.md index 0bccdc0..35c1118 100644 --- a/src/compile/why-distributed-compiling.md +++ b/src/compile/why-distributed-compiling.md @@ -1,76 +1,11 @@ # 为什么需要分布式编译? -- 大型项目过长的编译耗时将会给开发、测试和调试都带来延迟,所以缩短大型项目的编译时间的分布式编译系统有重要意义 -- 使用分布式编译系统编译项目可以利用计算机集群提高编译效率,缩短项目编译时间 -- 在实际开发时,同一个团队大量的编译任务时相同的。CloudBuild提供的编译缓存可以避免重复上传和重复编译,从而进一步加快编译效率 +大型项目过长的编译耗时给开发、调试、测试和CI/CD都带来延迟,缩短大型项目的编译时间是分布式编译系统的主要目标。 -## 总体架构 -### 系统总体架构 -![alt text](/public/compile/architecture.png) -- Ninja:客户端,该机器上需要保存有完整的待编译项目源代码。 -- Action Cache:服务端缓存,主要保存编译任务的执行结果。 -- CAS Cache:服务端缓存,主要保存客户端上传的依赖文件,编译结果文件。 -- Scheduler:任务调度器,将编译任务id分发到各个编译节点。 -- Redis:主要存储具体的编译任务供编译节点领取执行,也可存储Action Cache和 CAS Cache中的内容加速编译。 -- MySQL:主要存储编译过程中的任务统计信息。 -- Executor:各个编译节点 +- 使用分布式编译系统编译项目可以利用计算机集群提高编译效率,缩短项目编译时间。 +- 在实际开发时,同一个团队有大量编译任务是相同的,分布式编译缓存可以避免重复编译,从而节约算力消耗并进一步缩短项目编译时间。 -### 部署示意图 -![alt text](/public/compile/system-diagram.png) -CloudBuild主程序分为三个部分:Client、Server、Executor。 -- Client:运行在客户端,和用户对接,用于生成待执行的远程编译任务, 同时也作为本地编译节点执行本地任务。 -- Server:运行在主服务器,主要用于连接各个编译节点,以及 将客户端上传的编译任务调度到与其连接的各个编译节点上。 -- Executor:运行在编译节点,负责接收并执行编译任务,是编译任务真正执行的地方。 - -### 系统分层结构 -![alt text](/public/compile/layered-system-architecture.png) - -## 运行原理与流程 - -### 分布式编译原理 -![alt text](/public/compile/compiler-principles.png) - -### CloudBuild客户端 -CloudBuild客户端基于Ninja改造,有下面这些优势 -- 兼容使用Ninja编译的项目 -- 使用远程执行的方式提高编译时并发度 -- 使用编译缓存减少需要编译的任务数量 - -### CloudBuild服务端 -- 使用远程执行的方法提高编译时并发度,实现了任务分发至远程节点同步执行 -- 使用分布式任务调度提高任务调度效率和计算节点资源利用率,避免集中式调度的任务阻塞问题 -- 使用编译缓存结合内容寻址存储技术减少网络传输量、避免重复上传与重复编译 - -### CloudBuild优势 -- 低成本:组成executor的机器不需要使用专门的高性能计算型机器,可使用多个平价的空闲机器 -- 高效:CloudBuild实现分布式编译的功能,相比单机大大提升并发度 -- 兼容Ninja:CloudBuild客户端基于Ninja改造,对于使用Ninja构建和可以转换为Ninja构建的项目不用额外修改构建清单 - -### CloudBuild执行流程 -- 客户端: 生成远程任务->生成任务依赖->发送任务与依赖 -- 服务端:检查任务缓存->检查依赖完整性->调度任务 -- 编译结点:还原文件目录->还原文件目录->返回编译结果 - -## AOSP和LLVM上的应用 -### LLVM上的应用效果 -![alt text](/public/compile/table1.png) -### AOSP上的应用效果 -![alt text](/public/compile/table2.png) -### CloudBuild硬件资源利用率 -4核CPU利用率: -![alt text](/public/compile/CPU-utilization-4.png) -8核CPU利用率: -![alt text](/public/compile/CPU-utilization-8.png) -16核CPU利用率: -![alt text](/public/compile/CPU-utilization-16.png) - -## CloudBuild使用方法 -### CloudBuild安装 -![alt text](/public/compile/cloudbuild-installation.png) -CloudBuild项目地址:https://gitee.com/cloudbuild888/cloudbuild.git -### CloudBuild分布式编译 -![alt text](/public/compile/cloudbuild-distributed-compilation.png) -LLVM项目地址:https://gitee.com/mirrors/LLVM.git +![alt text](/public/compile/promotional-graphic-cloudbuild.jpg) From e2b50e218888ff239ab850e86af6e3a6d2732d4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E5=AE=81?= Date: Fri, 5 Dec 2025 02:10:49 +0000 Subject: [PATCH 4/8] =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E4=B8=8A=E7=9A=84?= =?UTF-8?q?=E9=93=BE=E6=8E=A5=E5=8F=AF=E4=BB=A5=E6=90=BA=E5=B8=A6.md?= =?UTF-8?q?=E7=BB=93=E5=B0=BE=EF=BC=8C=E5=85=BC=E5=AE=B9=E7=BD=91=E7=AB=99?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E5=92=8CGit=E4=BB=93=E5=BA=93Web=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/compile/index.md | 2 +- src/compile/sharebuild-aosp14.md | 2 +- src/compile/sharebuild.md | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/compile/index.md b/src/compile/index.md index 8e4091a..956ad46 100644 --- a/src/compile/index.md +++ b/src/compile/index.md @@ -8,7 +8,7 @@ - [为什么需要分布式编译?](/src/compile/why-distributed-compiling) - [CloudBuild私有云分布式编译系统](/src/compile/cloudbuild) - [ShareBuild分布式共享编译工作站](/src/compile/sharebuild) - - [以AOSP14项目为例ShareBuild分布式编译详细配置方法](/src/compile/sharebuild-aosp14) + - [以AOSP14项目为例ShareBuild分布式编译详细配置方法](/src/compile/sharebuild-aosp14.md) ## AI编译器 diff --git a/src/compile/sharebuild-aosp14.md b/src/compile/sharebuild-aosp14.md index 390ecd1..6dcb6a4 100644 --- a/src/compile/sharebuild-aosp14.md +++ b/src/compile/sharebuild-aosp14.md @@ -1,4 +1,4 @@ -# ShareBuild分布式共享编译工作站 +# 以AOSP14项目为例ShareBuild分布式编译详细配置方法 ## ShareBuild的适用场景 diff --git a/src/compile/sharebuild.md b/src/compile/sharebuild.md index 1d4d1f3..4bed3c0 100644 --- a/src/compile/sharebuild.md +++ b/src/compile/sharebuild.md @@ -48,7 +48,7 @@ ninja -t clean #清除编译产物 ## 使用ShareBuild编译Android开源项目(AOSP) -除按照以上方法准备好编译环境和开启ShareBuild模式外,以AOSP14项目为例([详细的配置方法](/src/compile/sharebuild-aosp14)),还需要替换ninja和准备.sharebuild.yml来过滤掉一些无法远程编译的命令,具体操作如下: +除按照以上方法准备好编译环境和开启ShareBuild模式外,以AOSP14项目为例([详细的配置方法](/src/compile/sharebuild-aosp14.md)),还需要替换ninja和准备.sharebuild.yml来过滤掉一些无法远程编译的命令,具体操作如下: ``` cp /usr/bin/android_ninja prebuilts/build-tools/linux-x86/bin/ninja @@ -65,7 +65,7 @@ todo ## 参考链接 -* [以AOSP14项目为例ShareBuild分布式编译详细配置方法](/src/compile/sharebuild-aosp14) +* [以AOSP14项目为例ShareBuild分布式编译详细配置方法](/src/compile/sharebuild-aosp14.md) ## 版权声明 From d2e6ecbeba99cfec795a0d882ee12e64d7db2b31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E5=AE=81?= Date: Fri, 5 Dec 2025 06:58:25 +0000 Subject: [PATCH 5/8] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20src/compile/why-distri?= =?UTF-8?q?buted-compiling.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/compile/why-distributed-compiling.md | 65 +++++++++++++++++++----- 1 file changed, 52 insertions(+), 13 deletions(-) diff --git a/src/compile/why-distributed-compiling.md b/src/compile/why-distributed-compiling.md index 35c1118..892d2d0 100644 --- a/src/compile/why-distributed-compiling.md +++ b/src/compile/why-distributed-compiling.md @@ -1,13 +1,52 @@ -# 为什么需要分布式编译? - -大型项目过长的编译耗时给开发、调试、测试和CI/CD都带来延迟,缩短大型项目的编译时间是分布式编译系统的主要目标。 - -- 使用分布式编译系统编译项目可以利用计算机集群提高编译效率,缩短项目编译时间。 -- 在实际开发时,同一个团队有大量编译任务是相同的,分布式编译缓存可以避免重复编译,从而节约算力消耗并进一步缩短项目编译时间。 - -![alt text](/public/compile/promotional-graphic-cloudbuild.jpg) - - - - - +# 为什么需要分布式编译? + +大型项目过长的编译耗时给开发、调试、测试和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%,因此本系统可以大幅缩短编译时间,加快项目迭代速度。 + +![alt text](/public/compile/promotional-graphic-cloudbuild.jpg) + +## 参考链接 + + - [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. + + + + + From 855c9b086906a5ea4972fdc05294f50cfcd85895 Mon Sep 17 00:00:00 2001 From: ych <2416006706@qq.com> Date: Sat, 6 Dec 2025 13:53:36 +0000 Subject: [PATCH 6/8] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20src/compile/sharebuild?= =?UTF-8?q?-aosp14.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/compile/sharebuild-aosp14.md | 81 ++++++++++++++++---------------- 1 file changed, 41 insertions(+), 40 deletions(-) diff --git a/src/compile/sharebuild-aosp14.md b/src/compile/sharebuild-aosp14.md index 6dcb6a4..2e481e1 100644 --- a/src/compile/sharebuild-aosp14.md +++ b/src/compile/sharebuild-aosp14.md @@ -1,66 +1,67 @@ # 以AOSP14项目为例ShareBuild分布式编译详细配置方法 -## ShareBuild的适用场景 +## 编译环境准备 -在同一局域网内工作的小型团队,ShareBuild以P2P共享架构将空闲算力贡献给团队其他成员,从而为每个团队成员提供编译加速效果。 +### 安装编译依赖 +* 参与编译的同一个局域网内的A、B、C等所有节点上安装编译环境依赖: +```bash +# 安装核心开发工具和库 +sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig -## ShareBuild QuickStart +# 安装Android 14所需的Java环境 +sudo apt-get install openjdk-17-jdk -* 同一个局域网内的A、B、C等所有节点上安装ninja2: +# 确保Python 3环境正确安装 +sudo apt-get install python3 python3-pip +``` +### 下载 AOSP 源码 +* 选择任一节点作为客户端节点,下载AOSP14源码: +```bash +mkdir ~/bin && curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo && chmod a+x ~/bin/repo +export PATH=~/bin:$PATH +repo init --depth=1 --partial-clone -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-14.0.0_r2 +repo sync -j16 +``` +### 配置 Sharebuild 环境 + +* 参与编译的同一个局域网内的A、B、C等所有节点上安装ninja2和sharebuild: ``` wget -c https://raw.githubusercontent.com/ninja-cloudbuild/ninja2/refs/heads/main/install.sh && chmod +x install.sh && sudo ./install.sh ``` -* 启用ShareBuild的前置要求 - - 1. 所有节点上均安装配置好了项目的编译环境,即所有节点上均能采用ninja成功单机编译项目。 - - -* 选择任一节点上作为项目开发环境,开启ShareBuild模式,然后进行分布式编译。 +* 开启ShareBuild模式,然后进行分布式编译。 项目根目录下创建ninja2.conf 文件如下即可开启ShareBuild模式: ``` sharebuid:true ``` -这时使用ninja编译将自动进入ShareBuild模式分布式编译项目。 -> 如果直接使用ninja命令编译项目,也可以加上-s参数表示启用ShareBuild模式,示例如下: -``` -ninja -s -r `realpath ../` #启动分布式编译,注意-r 指定项目根目录 -ninja -t clean #清除编译产物 +* 在项目根目录下进行分布式编译。 +```bash +su # 切换到 root 关闭沙箱 +source build/envsetup.sh # 初始化环境 +lunch aosp_arm-eng # 选择目标配置 + +make # 执行编译任务 + + +rm -r out #清除编译产物 ```` -* 对一些特殊项目的补充说明 -除以上常规的ShareBuild配置外,对于一些特殊项目需要做一些额外的配置,补充说明如下: -## 使用ShareBuild编译Android开源项目(AOSP) - -除按照以上方法准备好编译环境和开启ShareBuild模式外,以AOSP14项目为例,还需要替换ninja和准备.sharebuild.yml来过滤掉一些无法远程编译的命令,具体操作如下: - -``` -cp /usr/bin/android_ninja prebuilts/build-tools/linux-x86/bin/ninja -cp /etc/ninja2/aosp14/.sharebuild.yml ./ -``` - -然后就可以单机编译一样使用make命令来分布式编译Android开源项目(AOSP)。 - ## 版权声明 Copyright @ Mengning Software From b1afa7d90241742f8f284487636c06ca38d2e516 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E5=AE=81?= Date: Sun, 7 Dec 2025 06:39:52 +0000 Subject: [PATCH 7/8] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20src/compile/sharebuild?= =?UTF-8?q?-aosp14.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/compile/sharebuild-aosp14.md | 51 ++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/src/compile/sharebuild-aosp14.md b/src/compile/sharebuild-aosp14.md index 2e481e1..ae8291f 100644 --- a/src/compile/sharebuild-aosp14.md +++ b/src/compile/sharebuild-aosp14.md @@ -2,8 +2,19 @@ ## 编译环境准备 -### 安装编译依赖 +### 安装 Sharebuild + +* 参与编译的同一个局域网内的A、B、C等所有节点上安装ninja2和sharebuild: +``` +wget -c https://raw.githubusercontent.com/ninja-cloudbuild/ninja2/refs/heads/main/install.sh && chmod +x install.sh && sudo ./install.sh +``` + +* 确保所有节点上均安装配置好了项目的编译环境,即所有节点上均能采用ninja成功单机编译项目。 + +### 安装AOSP项目编译环境 + * 参与编译的同一个局域网内的A、B、C等所有节点上安装编译环境依赖: + ```bash # 安装核心开发工具和库 sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig @@ -14,31 +25,35 @@ sudo apt-get install openjdk-17-jdk # 确保Python 3环境正确安装 sudo apt-get install python3 python3-pip ``` -### 下载 AOSP 源码 + +### 下载 AOSP 源码并执行单机编译 + * 选择任一节点作为客户端节点,下载AOSP14源码: + ```bash mkdir ~/bin && curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo && chmod a+x ~/bin/repo export PATH=~/bin:$PATH repo init --depth=1 --partial-clone -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-14.0.0_r2 repo sync -j16 -``` -### 配置 Sharebuild 环境 -* 参与编译的同一个局域网内的A、B、C等所有节点上安装ninja2和sharebuild: -``` -wget -c https://raw.githubusercontent.com/ninja-cloudbuild/ninja2/refs/heads/main/install.sh && chmod +x install.sh && sudo ./install.sh +cd android-14.0.0_r2 +source build/envsetup.sh # 初始化环境 +lunch aosp_arm-eng # 选择目标配置 +make # 执行单机编译,编译成功后可以看到: +# add some output ``` -* 确保所有节点上均安装配置好了项目的编译环境,即所有节点上均能采用ninja成功单机编译项目。 +### 配置AOSP项目开启ShareBuild模式 * 将.sharebuild.yml 复制到 AOSP 根目录 ``` -cp /etc/ninja2/aosp14/.sharebuild.yml android-14.0.0_r2 +cd android-14.0.0_r2 +cp /etc/ninja2/aosp14/.sharebuild.yml ./ ``` + * 进入AOSP14项目根目录,替换 AOSP 内部 ninja 为 android_ninja ``` -cd android-14.0.0_r2 cp /usr/bin/android_ninja prebuilts/build-tools/linux-x86/bin/ninja ``` @@ -48,20 +63,18 @@ cp /usr/bin/android_ninja prebuilts/build-tools/linux-x86/bin/ninja sharebuid:true ``` -* 在项目根目录下进行分布式编译。 +* 在项目根目录下执行分布式编译 + ```bash su # 切换到 root 关闭沙箱 source build/envsetup.sh # 初始化环境 -lunch aosp_arm-eng # 选择目标配置 - -make # 执行编译任务 - - -rm -r out #清除编译产物 +lunch aosp_arm-eng # 选择目标配置 +make # 执行分不知编译,编译成功后可以看到: +# add some output +make clean # 清除编译目标文件 +rm -r out # 清除编译产物 ```` - - ## 版权声明 Copyright @ Mengning Software From 39859809a53e4c956ace19dbafebf34b28f5bf48 Mon Sep 17 00:00:00 2001 From: ych <2416006706@qq.com> Date: Sun, 7 Dec 2025 07:41:29 +0000 Subject: [PATCH 8/8] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20src/compile/sharebuild?= =?UTF-8?q?-aosp14.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/compile/sharebuild-aosp14.md | 53 +++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/src/compile/sharebuild-aosp14.md b/src/compile/sharebuild-aosp14.md index ae8291f..a8d4314 100644 --- a/src/compile/sharebuild-aosp14.md +++ b/src/compile/sharebuild-aosp14.md @@ -41,8 +41,22 @@ cd android-14.0.0_r2 source build/envsetup.sh # 初始化环境 lunch aosp_arm-eng # 选择目标配置 make # 执行单机编译,编译成功后可以看到: -# add some output + ``` +``` +[19:20:05.430], pending/wanted: 4, ready: 1, running: 0 + + +#### build completed successfully (02:26:51 (hh:mm:ss)) #### + + +real 146m51.385s +user 1327m35.812s +sys 78m2.153s +root@lab1:/home/lab1/android-14.0.0_r2# +``` + + ### 配置AOSP项目开启ShareBuild模式 @@ -69,12 +83,41 @@ sharebuid:true su # 切换到 root 关闭沙箱 source build/envsetup.sh # 初始化环境 lunch aosp_arm-eng # 选择目标配置 -make # 执行分不知编译,编译成功后可以看到: -# add some output +make # 执行分布式编译,编译成功后可以看到: +``` +* 客户端节点: +``` +[ShareBuild] Command will be executed REMOTELY +[ShareBuild] ---------------------------------------- +[100% 130093/130093] Target vbmeta image: out/target/product/generic/vbmeta.img +stdout: , stderr: + +[16:34:34.063], pending/wanted: 5, ready: 2, running: 0 + + +#### build completed successfully (01:42:17 (hh:mm:ss)) #### + + +real 102m16.362s +user 1074m56.673s +sys 64m22.863s +root@lab1:/home/lab1/android-14.0.0_r2# +``` +* 服务端节点sharebuild部分日志: +``` +{"severity":"INFO","timestamp":"2025-11-24T16:34:38.988708686+08:00","caller":"service/sharebuild_proxy.go:448","message":"Successfully cl +eared environment on executor","component":"proxy","executor":"id:\"12D3KoowBsw2Lrs7FwKkmgrmRt3MYQgNzLa82vjK8tve8gQ95KTk\"ip:\"192.168.1. +12\" port:39077 "} +{"severity":"INFO","timestamp":"2025-11-24T16:34:38.99059505+08:00","caller":"runner/project_runner.go:463","message":"ProjectRunner free. +.. ","component":"runner", "ReceivedtaskCount":0,"PreemptedTaskCount":33291} +[worker-17]Stopping worker +[worker-24]Stopping worker +``` + +``` make clean # 清除编译目标文件 rm -r out # 清除编译产物 -```` - +``` ## 版权声明 Copyright @ Mengning Software