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] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E6=95=B4=E7=90=86=E7=9A=84?= =?UTF-8?q?=E7=BC=96=E8=AF=91=E5=8A=A0=E9=80=9F=E7=9B=B8=E5=85=B3=E6=96=87?= =?UTF-8?q?=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)