You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何配置distcc实现预处理与编译全量远程执行?

针对distcc任务分配与泵模式失效的解决方案

结合你使用的distcc 3.2rc1.2、gcc 4.4.5,以及128核服务器+老旧双核客户端的场景,我来帮你逐一解决这两个问题:

问题1:任务始终平均分配给客户端与服务器

你的核心问题出在/etc/distcc/hosts的配置逻辑上,加上make并行参数没有匹配服务器性能:

配置错误分析

  • 你同时写了127.0.0.1localhost/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

火山引擎 最新活动