distcc:分布式C++编译加速原理
请介绍 distcc 分布式编译的工作原理,如何配置 distcc 在多台机器上并行编译 C++ 项目,以及 distcc 的局限性(预处理需求、网络延迟影响等)。
回答
Yahuda
distcc 原理:将 .cpp 文件的编译(汇编+编译)分发到远端机器,本地进行预处理和链接。
架构:
- 本地运行
distcc(客户端),将预处理后的 .i 文件发送给远端。 - 远端运行
distccd(守护进程),接收预处理器输出,执行实际编译。 - 目标文件传回本地进行链接。
配置:
# 服务端(所有编译节点)
distccd --daemon --allow 192.168.1.0/24 --jobs 4
# 客户端
export CC=/usr/bin/distcc gcc
export CXX=/usr/bin/distcc g++
export DISTCC_HOSTS="host1 host2 host3"
export DISTCC_JOBS=16 # 总并行数
# CMake
cmake -DCMAKE_C_COMPILER_LAUNCHER=distcc \
-DCMAKE_CXX_COMPILER_LAUNCHER=distcc ..
make -j16
工作流程:
- 本地预处理器展开所有宏和头文件(生成 .i 文件)。
- 本地 distcc 将 .i 文件 + 编译器选项发送到远端。
- 远端 distccd 执行实际的编译(
.i → .o)。 - 远端将 .o 文件传回本地。
- 本地链接器链接所有 .o 文件。
局限性:
- 预处理必须在本地完成(大规模项目的预处理本身较慢)。
- 网络延迟敏感(LAN 环境最佳)。
- 不加速链接(链接始终在本地)。
- 头文件修改后所有相关源文件被分发,增加带宽。
- 需要各节点相同编译器版本(ABI 兼容)。
组合使用:常与 ccache 结合(本地缓存 + 远程编译)。