yadcc —— C++ 分布式编译系统
yadcc(Yet Another Distributed C++ Compiler)是一套腾讯广告自研的分布式编译系统,用于支撑腾讯广告的日常开发及流水线。相对于已有的同类解决方案,其针对实际的工业生产环境做了性能、可靠性、易用性等方面优化。
yadcc 目前在腾讯 1700+ 核的集群中每天编译 300,0000+ 个目标文件,产出约 3~5TB,已经持续稳定运营 8 个月。取决于代码逻辑及本地机器配置,yadcc 可以利用几百乃至 1000+ 核同时编译(腾讯内部使用 512 并发编译),大大加快构建速度。
具体简介及技术细节可以参考技术文档。
系统要求
- Linux 3.10 及以上内核,暂不支持其他操作系统;
- x86-64 处理器;
- 编译
yadcc
需要GCC 8 及以上版本的编译器,基于yadcc
进行分布式编译时可以支持其他更低版本编译器。
基本原理
- 客户端伪装成编译器(通常是通过
ln -sf yadcc g++
创建的符号链接) - 通过将客户端伪装的编译器加入
PATH
头部,这样构建系统就会实际执行yadcc
来编译 yadcc
会按照命令行对源代码进行预处理,得到一个自包含的的预处理结果- 以预处理结果、编译器签名、命令行参数等为哈希,查询缓存,如果命中,直接返回结果
- 如果不命中,就请求调度器获取一个编译节点,分发过去做编译
- 等待直到从编译集群中得到编译结果,并更新缓存
由于预处理时间通常远小于编译时间,因此这样可以降低单个文件的本地开销。同时,由于等待编译结果时本地无需进行操作,因此可以增大本地的编译并发度(如8核机器通常可以make -j100
),以此实现更高的吞吐。
需要注意的是,分布式编译通常只能提高吞吐,但是不能降低单个文件的编译耗时(假设不命中缓存)。因此,对于无法并发编译的工程,除非命中缓存,否则分布式编译通常不能加快编译,反而可能有负面效果。
设计特点
系统由调度器、缓存服务器、守护进程及客户端组成:
- 对上层的构建系统(Make、CMake,Blade、Bazel 等)透明,方便适配各种构建系统。
- 调度器全局共享,所有请求均由调度节点统一分配。这样,低负载时可允许客户端尽可能提交更多的任务,集群满载时可阻塞新请求避免过载。
- 中心的调度节点也避免了需要客户机感知编译集群的列表的需要,降低运维成本。
- 编译机向调度器定期心跳,这样我们不需要预先在调度器处配置编译机列表,降低运维成本。
- 分布式缓存避免不必要的重复编译。同时本地守护进程处会维护缓存的布隆过滤器,避免无意义的缓存查询引发不必要的网络延迟。
- 使用本地守护进程和外界通信,这避免了每个客户端均反复进行TCP启动等操作,降低开销。另外这也允许我们在守护进程处维护一定的状态,提供更多的优化可能。
- 客户端会和本地守护进程通信,综合控制本地任务并发度避免本地过载。
- 通过编译器哈希区分版本,这允许我们的集群中存在多个不同版本的编译器。
同时,做了多层重试,确保不会因为网络抖动、编译机异常离线等工业场景常见的问题导致的不必要的失败。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Nvidia 计划停止支持 Windows7 和 Windows 8/8.1
根据 Nvidia 的最新公告显示,其已经计划结束对Windows7 和 Windows 8/8.1的支持。 Windows 7 已经推出超过 11 年了,在其 12 周年纪念日之前,显卡生产商 Nvidia 将停止支持这个老化的操作系统。一份针对 Windows 7 和 Windows 8/8.1的支持计划显示,从 2021 年 10 月开始,Game Ready Driver 的升级,包括性能增强、新功能和错误修复,将专门提供给 Windows 10 操作系统。 Nvidia 表示,由于 Microsoft 已正式终止对 Windows 7 和 Windows 8 的支持,Windows 8.1 的生命周期也接近尾声,所以其绝大多数 GeForce 客户已迁移到 Windows 10 操作系统。为了确保 GeForce 用户体验到最佳的安全性、支持和功能,NVIDIA 现在将专注于 Windows 10 操作系统。 不过,一直到 2024 年 9 月,Nvidia 仍将在 Windows 7、Windows 8 或 Windows 8.1 系统上提供关键安全更新。据悉,支持 Win...
- 下一篇
Linux 上的 RISC-V 将支持 Transparent Hugepages
根据最新的提交显示,Linux 内核的 RISC-V 即将获得Transparent Hugepages(THP)支持。 Linux 内核的 RISC-V 继最近添加原地执行 XIP、对 KProbes 和其他功能的支持以及硬件特定工作如 SiFive FU740 SoC 支持后,由华为工程师提供的 Transparent Hugepages 支持现在也已准备就绪。 Transparent Hugepages 是 Linux 的内存管理功能,将透明的大页面表示为一个 pmd,用于减少页面查找的 TLB 开销并提高其性能,特别是对于具有大量内存的系统。除了某些数据库服务器等工作负载外,THP 均可以提高性能,同时以透明的方式提供大页面支持,而无需应用程序进行任何额外的工作。 目前,该补丁正在排队进入“next” 分支,如无意外,将会在未来几周内的 Linux 5.14 周期中合并到主线。
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Windows10,CentOS7,CentOS8安装Nodejs环境
- MySQL8.0.19开启GTID主从同步CentOS8
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Hadoop3单机部署,实现最简伪集群
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果