如何配置distcc实现预处理与编译全量远程执行?
针对distcc任务分配与泵模式失效的解决方案
结合你使用的distcc 3.2rc1.2、gcc 4.4.5,以及128核服务器+老旧双核客户端的场景,我来帮你逐一解决这两个问题:
问题1:任务始终平均分配给客户端与服务器
你的核心问题出在/etc/distcc/hosts的配置逻辑上,加上make并行参数没有匹配服务器性能:
配置错误分析
- 你同时写了
127.0.0.1和localhost/0,这两个指向同一本地主机。distcc会按顺序读取hosts条目,前面的127.0.0.1会被默认赋予客户端核心数(2个)的并行任务配额,后面的localhost/0完全不会生效。 172.24.26.208/8只给服务器分配了8个并行任务,完全浪费了128核的性能。
修正后的hosts配置
替换原文件内容为:
# --- /etc/distcc/hosts ----------------------- # See the "Hosts Specification" section of # "man distcc" for the format of this file. # # 优先指定远程服务器,分配128个并行任务,启用cpp和lzo压缩 172.24.26.208/128,cpp,lzo # 明确禁用本地任务,确保所有构建请求发往服务器 localhost/0
调整构建并行参数
- 把
make -j8改成make -j128,让distcc能充分利用服务器的128核资源(客户端只是调度任务,不需要限制并行数)。 - 可以额外设置环境变量强化配置:
export DISTCC_JOBS=128 export DISTCC_HOSTS="172.24.26.208/128,cpp,lzo localhost/0"
验证效果
修改配置后重启客户端的distcc服务(如果是后台运行的话),然后执行distccmon-text 1实时监控任务流,此时再运行make命令,应该看不到本地有任务执行了。
问题2:预处理始终在本地执行,泵模式失效
distcc 3.2rc1.2的泵模式对gcc 4.4.x有特定要求,你需要检查以下几点:
服务器端distccd配置
确保服务器的distccd启动时添加了--allow-cpp参数,否则会拒绝预处理请求。比如:
- 如果是init脚本启动,修改启动命令为:
distccd --daemon --allow 172.24.0.0/16 --allow-cpp --jobs 128 - 如果是systemd服务,在service文件的
ExecStart行加上--allow-cpp,然后重启distccd服务。
客户端泵模式的正确启用方式
- 先确保没有禁用泵模式的环境变量:
unset DISTCC_NO_PUMP export DISTCC_PUMP_MODE=1 - 执行构建命令时,要确保makefile没有硬编码CC/CXX参数,完整命令应为:
time pump make CC="distcc gcc" CXX="distcc g++" -j128
旧版本的特殊处理
由于你用的是rc版本的distcc,泵模式的自动头文件同步可能不稳定,可以手动启动同步守护进程:
distcc-pump --start # 执行构建命令 time pump make CC="distcc gcc" CXX="distcc g++" -j128 # 构建完成后关闭同步进程 distcc-pump --stop
日志排查
如果还是不行,查看服务器的distcc日志(通常在/var/log/distccd.log),检查是否有预处理请求被拒绝的记录;同时确认客户端与服务器的系统头文件完全一致(你用了匹配的发行版虚拟机,这一步应该没问题,但可以对比/usr/include/stdio.h这类核心头文件验证)。
额外注意事项
- 服务器端需要调整系统文件描述符上限:执行
ulimit -n 4096(可以加到/etc/security/limits.conf里永久生效),避免因文件描述符不足导致任务失败。 - 若有多台客户端,服务器的
--jobs 128参数可以限制总并行数,防止服务器过载。
内容的提问来源于stack exchange,提问作者Duck Dodgers




