0

0

如何使用ccache和sccache提升云端c++编译速度? (分布式缓存)

尼克

尼克

发布时间:2026-02-01 19:57:08

|

177人浏览过

|

来源于php中文网

原创

ccache在云端CI中基本失效,因其仅支持本地缓存、对路径和编译选项敏感、无法跨机器共享且不兼容-fdebug-prefix-map等现代选项;sccache需配置远程存储并禁用非确定性选项才能真正生效。

如何使用ccache和sccache提升云端c++编译速度? (分布式缓存)

ccachesccache 做云端 C++ 编译加速,关键不在于“装上就快”,而在于缓存是否真正被命中、是否跨机器共享、以及是否绕过了编译器本身的不可缓存行为。单机 ccache 在 CI/CD 中几乎无效;真正起效的是带远程存储的 sccache,且必须正确配置编译环境使其生成可复用的哈希键。

为什么 ccache 在云端 CI 中基本失效

ccache 默认只做本地文件系统缓存,且对绝对路径、临时目录、宏定义顺序极度敏感。CI 环境中每次构建都在全新容器或虚拟机里运行,CCACHE_BASEDIR 若未统一,所有缓存键都会错乱;更致命的是,它无法处理 -fdebug-prefix-map-frecord-gcc-switches 等现代构建系统默认启用的选项,导致 99% 的编译单元无法命中缓存。

  • CI 构建路径通常是随机的(如 /tmp/xyz123/build),ccache 把路径嵌入哈希,缓存完全不复用
  • Clang/GCC 新版本默认加 -frecord-gcc-switches,记录完整命令行(含绝对路径),进一步破坏一致性
  • 没有内置 S3/GCS/Redis 后端,无法实现多 runner 共享缓存

sccache 必须启用远程存储并禁用非确定性选项

sccache 原生支持 S3、GCS、Redis 和 HTTP 后端,但默认仍走本地磁盘。要让它在云端生效,必须显式配置远程存储,并同步调整编译命令以消除哈希扰动。

  • 启动时必须指定后端:例如 sccache --start-server --cache-dir /dev/shm --s3-bucket my-ccache-bucket --s3-region us-east-1
  • 编译前导出环境变量export SCCACHE_BUCKET=my-ccache-bucketSCCACHE_REGION=us-east-1,且确保 AWS 凭据可用(推荐使用 IRSA 或 workload identity)
  • 在 CMake 中强制关闭非确定性选项:add_compile_options(-fdebug-prefix-map=/tmp/build= -frecord-gcc-switches),其中 /tmp/build 需与 CI 实际工作目录一致
  • 避免使用 -g 以外的调试格式(如 -gdwarf-5),某些版本 sccache 对新版 DWARF 支持不稳定

如何验证缓存是否真实生效

别只看 sccache --show-stats 里的 hit rate——它可能显示 80%,但全是本地旧缓存。真正要看的是远程后端的实际 GET/PUT 请求量,以及编译日志中每条命令前是否出现 [sccache] Cache hit

文心大模型
文心大模型

百度飞桨-文心大模型 ERNIE 3.0 文本理解与创作

下载

立即学习C++免费学习笔记(深入)”;

  • 在 CI 脚本中加入:sccache --show-stats | grep -E "(Cache hits|Cache misses)",并在每次构建后清空本地缓存(sccache --stop-server && rm -rf /tmp/sccache)来排除本地干扰
  • 检查 S3 bucket 是否有新 object 写入:对象名形如 ff/ff1234abcd.../output.o,若连续多次构建无新增,则说明没上传——大概率是编译命令哈希不一致
  • 开启 debug 日志:SCCACHE_LOG=debug sccache --dist-status,观察是否报 Failed to get cache entry: key not found,这通常意味着预处理器输出不一致(比如头文件时间戳、__DATE__ 宏)

分布式编译(distcc)和 sccache 不要混用

sccache 自带分布式编译能力(通过 --dist-server),但它和传统 distcc 是互斥的。若你在 CMake 中设置了 CMAKE_CXX_COMPILER_LAUNCHER=distccsccache 就不会介入编译流程,等于白配。

  • 只用 sccache 就够了:它既做缓存又做分发,无需额外部署 distcc 集群
  • 确保 CXX 指向 sccache:例如 export CXX="sccache clang++",而不是 export CXX="clang++" + 单独 launcher
  • 如果已有 distcc 流程,必须彻底移除所有 distcc 相关环境变量(DISTCC_HOSTSCCACHE_PREFIX=distcc

最常被忽略的一点:C++ 模板实例化和宏展开高度依赖头文件内容与顺序,哪怕一个头文件里多了一个空格,哈希就全变。所以不要指望第一次构建就能高命中——先跑通一次完整构建,让缓存“热起来”,再观察后续增量构建的收益。否则你看到的永远是 0% hit。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

352

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

236

2023.10.07

golang map内存释放
golang map内存释放

本专题整合了golang map内存相关教程,阅读专题下面的文章了解更多相关内容。

75

2025.09.05

golang map相关教程
golang map相关教程

本专题整合了golang map相关教程,阅读专题下面的文章了解更多详细内容。

36

2025.11.16

golang map原理
golang map原理

本专题整合了golang map相关内容,阅读专题下面的文章了解更多详细内容。

61

2025.11.17

java判断map相关教程
java判断map相关教程

本专题整合了java判断map相关教程,阅读专题下面的文章了解更多详细内容。

42

2025.11.27

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

982

2023.11.02

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

641

2023.11.14

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

30

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
进程与SOCKET
进程与SOCKET

共6课时 | 0.4万人学习

Redis+MySQL数据库面试教程
Redis+MySQL数据库面试教程

共72课时 | 6.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号