distcc 与 3632 端口
distcc 是一套分布式 C/C++ 编译工具:本地只做预处理,把展开后的源码分发给多台运行 distccd 的机器并行编译,再把目标文件取回本地链接。3632 是 distccd 的监听端口,IANA 登记名为 distributed compiler,2002 年 11 月由 Martin Pool 注册,属厂商自用的常规端口而非 RFC 标准。它只解决编译阶段,不负责调度与依赖管理,通常配合 make -j 与内网构建农场使用。
基本信息
| 服务 | distccd(distcc 守护进程) |
|---|---|
| 端口/协议 | TCP 3632(IANA 登记,可自定义) |
| 分发内容 | 预处理后的 .i/.ii 源码加编译选项 |
| 服务端关键参数 | --daemon --allow <网段> --listen <地址> --jobs <并发> |
| 客户端环境变量 | DISTCC_HOSTS=host/n,n 为该机可用槽位数 |
| 适用平台 | Linux/Unix,两端编译器版本须一致 |
| 权限要求 | 客户端普通用户;distccd 可降权运行 |
| 安全等级 | 仅构建网段,禁止公网暴露 |
典型使用场景
- 大型 C/C++ 项目编译加速:本机核数不足时把编译分散到构建农场
- 嵌入式交叉编译:为每个目标架构准备一套 distccd 与对应工具链
- CI 构建机扩容:用多台普通机器堆出可观的并发编译能力
- 老项目增量构建:已有 Makefile 时改动成本最低的加速方案
- 团队共享编译资源:统一工具链镜像后多人共用同一编译池
服务端与客户端配置
服务端与客户端配置
distccd --daemon --allow 10.0.0.0/8 --listen 0.0.0.0 --jobs 8 # 只允许内网构建网段接入
export DISTCC_HOSTS='localhost/4 10.0.1.11/8 10.0.1.12/8' # 本地 4 槽加远端各 8 槽
make -j32 CC='distcc gcc' CXX='distcc g++' # 用 distcc 包装编译器
DISTCC_VERBOSE=1 make -j8 # 出问题时打印分发细节
distccmon-text 2 # 实时观察任务落在哪台机器
ss -lntp | grep 3632 # 核对监听地址与进程
echo 'int main(void){return 0;}' > t.c && distcc gcc -c t.c # 最小自测,确认包装链正常常见现象与处置
| 现象 | 可能原因 | 处置方向 |
|---|---|---|
| 编译全部回退本地 | 远端 distccd 未启动或 DISTCC_HOSTS 写错 | 先看本机监听与槽位解析是否正确 |
| 连接被拒 | 防火墙未放行 3632 或被 --allow 拒绝 | 按网段放行并核对客户端源地址 |
| 远端报头文件缺失 | 两端工具链或头文件版本不一致 | 统一镜像与编译器版本 |
| 结果异常但不报错 | 编译器补丁级别不同导致优化差异 | 锁定 gcc/clang 版本与补丁 |
| 各构建机负载不均 | 槽位数与 CPU 核数不匹配 | 按核数调整 host/n 中的 n |
distcc 只加速编译不加速链接,链接阶段仍在本地串行;若瓶颈在链接、模板展开或生成头文件,收益会明显低于预期,先做一次构建耗时剖析再决定是否上分布式编译。
distccd 会以自身运行用户的权限执行编译器调用,早期版本在来源未限制时曾被利用执行任意命令。务必用 --allow 限定网段、避免以 root 运行,并让防火墙默认拒绝 3632 入站。