使用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
root@192.168.56.101

在编译项目时,给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,是图形化界面的状态监控。