使用 distcc 和 ccache 加快编译速度
Table of Contents
distcc 用于分布式编译 C/C++ 项目,ccache 用来缓存头文件从而加快编译 C/C++ 代码的速度。两款工具都由 Samba 团队开发,项目官方网站:
- distcc:https://github.com/distcc
- ccache:https://ccache.samba.org
编译 C/C++ 代码大致经过三个步骤:
- 预处理,如处理宏、解析头文件等
- 编译为二进制文件
- 链接
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,是图形化界面的状态监控。