yadcc 正在参加 2020 年度 OSC 中国开源项目评选,请投票支持!
yadcc 在 2020 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
投票让它出道
已投票
yadcc 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」 !
yadcc 获得 2020 年度 OSC 中国开源项目评选「最佳人气项目」「最积极运营项目」 !
yadcc 获得 2020 年度 OSC 中国开源项目评选「最积极运营项目」 !
授权协议 BSD
开发语言 C/C++
操作系统 Linux
软件类型 开源软件
所属分类 开发工具编译器
开源组织 腾讯
地区 国产
投 递 者 白开水不加糖
适用人群 未知
收录时间 2021-06-11

软件简介

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进行分布式编译时可以支持其他更低版本编译器。

基本原理

ccachedistccicecc等工具类似;

  • 客户端伪装成编译器(通常是通过ln -sf yadcc g++创建的符号链接)
  • 通过将客户端伪装的编译器加入PATH头部,这样构建系统就会实际执行yadcc来编译
  • yadcc会按照命令行对源代码进行预处理,得到一个自包含的的预处理结果
  • 以预处理结果、编译器签名、命令行参数等为哈希,查询缓存,如果命中,直接返回结果
  • 如果不命中,就请求调度器获取一个编译节点,分发过去做编译
  • 等待直到从编译集群中得到编译结果,并更新缓存

由于预处理时间通常远小于编译时间,因此这样可以降低单个文件的本地开销。同时,由于等待编译结果时本地无需进行操作,因此可以增大本地的编译并发度(如8核机器通常可以make -j100),以此实现更高的吞吐。

需要注意的是,分布式编译通常只能提高吞吐,但是不能降低单个文件的编译耗时(假设不命中缓存)。因此,对于无法并发编译的工程,除非命中缓存,否则分布式编译通常不能加快编译,反而可能有负面效果。

设计特点

系统由调度器、缓存服务器、守护进程及客户端组成:

  • 对上层的构建系统(Make、CMake,Blade、Bazel 等)透明,方便适配各种构建系统。
  • 调度器全局共享,所有请求均由调度节点统一分配。这样,低负载时可允许客户端尽可能提交更多的任务,集群满载时可阻塞新请求避免过载
  • 中心的调度节点也避免了需要客户机感知编译集群的列表的需要,降低运维成本。
  • 编译机向调度器定期心跳,这样我们不需要预先在调度器处配置编译机列表,降低运维成本。
  • 分布式缓存避免不必要的重复编译。同时本地守护进程处会维护缓存的布隆过滤器,避免无意义的缓存查询引发不必要的网络延迟。
  • 使用本地守护进程和外界通信,这避免了每个客户端均反复进行TCP启动等操作,降低开销。另外这也允许我们在守护进程处维护一定的状态,提供更多的优化可能。
  • 客户端会和本地守护进程通信,综合控制本地任务并发度避免本地过载。
  • 通过编译器哈希区分版本,这允许我们的集群中存在多个不同版本的编译器

同时,做了多层重试,确保不会因为网络抖动、编译机异常离线等工业场景常见的问题导致的不必要的失败。

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论 (2)

加载中
每核每天编译1千多个obj, 是不是太少了
06/13 11:26
回复
举报
你司每天编译多少
06/13 13:56
回复
举报
更多评论
发表了资讯
06/08 15:19

开源公告|C++ 分布式编译系统 yadcc 开源了

yadcc是广泛投产于腾讯广告后台的C++分布式编译系统。 我们在调研学习了业界的ccache、sccache、distcc、icecc等开源的编译加速系统之后,根据我们实际的工业生产场景,设计了这样一套系统。 目前我们实际生产环境: - 有~1700编译核心; - 使用512并发编译(实际并发度取决于本地预处理能力,32逻辑核以上可达到512并发); - 每天编译产出(含命中分布式缓存)300,0000+个目标文件; - 每天编译产出总计约3~5TB。 本着回馈社区...

1
16
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
暂无内容
暂无内容
2 评论
10 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部