使用 distcc 和 ccache 加快编译速度

Table of Contents

distcc 用于分布式编译 C/C++ 项目,ccache 用来缓存头文件从而加快编译 C/C++ 代码的速度。两款工具都由 Samba 团队开发,项目官方网站:

编译 C/C++ 代码大致经过三个步骤:

  1. 预处理,如处理宏、解析头文件等
  2. 编译为二进制文件
  3. 链接

1. ccache

第一个步骤会涉及到大量展开宏、解析头文件、合并头文件中引用的相关代码等操作,在项目较大时,整个过程会耗费相当的时间。ccache 的目的就是将第一步输出的内容缓存起来(如 gcc -E 的输出、部分 .o 文件)(默认缓存在 ~/.ccache 中),以后再次编译时尽可能用上。

1.1. 安装 ccache

通过包管理器或者源码编译方式安装,如 Fedora 下直接通过包管理器安装:

$ sudo dnf install ccache

1.2. 使用

ccache 使用方式非常简单:

$ ccache gcc filename.c

注意有些发型版通过包管理器安装后,默认的 gcc 命令会被链接到 ccache,比如 Fedora:

$ which gcc
/usr/lib64/ccache/gcc

2. distcc

整个编译过程最耗时的是在第二步——编译二进制文件,为了加快编译速度,distcc 将整个编译工作分发到不同的机器编译,然后把编译后的二进制文件拷贝回来。

不过建议编译较大的项目才用到 distcc,否则传输工作耗时可能比单机还长。

2.1. 安装 distcc

distcc 分服务端和客户端,有些 Linux 发型版的包管理器可能是将它们分为两个包的,如 Fedora 里,client 和 server 在不通的包中:

$ sudo dnf search distcc
distcc.x86_64 : Distributed C/C++ compilation
distcc-server.x86_64 : Server for distributed C/C++ compilation

如果是编译服务器,就安装 distcc-server,开发机则安装 distcc。

2.2. 配置和使用

2.2.1. 服务端

服端中只需运行 distccd 命令即可:

$ distccd --allow 192.168.56.0/8 --user distcc --daemon

–allow 参数设置了允许的客户端IP段范围,192.168.56.0/8 的范围是 192.168.56.1 ~ 192.168.56.255;

–user 指定 distccd 运行时的身份,这里用的 distcc 这个帐号,需要用 useradd 新建该帐号;

–daemon 表示进程后台中运行。

2.2.2. 客户端

需要将编译的服务主机地址写在 /etc/distcc/hosts~/.distcc/hosts 中。主机地址有多种格式,如果只填 IP 或主机名,distcc 以端口(默认 3632)方式连接到服务器,但个人觉得不妥,建议使用更安全的 SSH 方式连接,格式为:

[USER]@HOST
@HOST

如:

$ cat ~/.distcc/hosts
[email protected]

在编译项目时,给 make 指定 CC 参数即可:

$ make -j 6 CC='distcc'

或者,也可以配合 ccache:

$ make -j 6 CC='ccache distcc'

编译过程中 distcc 根据情况将编译任务分发到不同的服务器上进行,此时可运行 distccmon-text 查看编译时分发状况:

$ distccmon-text 1
  9846  Compile     anet.c                                   192.168.56.101[0]
  9845  Compile     sds.c                                    192.168.56.101[1]
  9847  Compile     ae.c                                     192.168.56.101[2]
  9857  Preprocess                                                localhost[1]

参数“1”表示每间隔1秒,刷新输出一次状态;如果不指定参数,则不会不断刷新。

另一个命令 distccmon-gnome,是图形化界面的状态监控。