公司目前用到VLC做项目,这玩意编译很耗时间(20~30分钟左右,根据configure和机器配置),而我们需要对其进行剪裁,免不了重复编译测试。而且公司机器比较烂,so,生命都浪费在等待上了。
忍无可忍就无需再忍!(某人名言)
一 解题思路
二 关于利用并行来提速编译的想法(买不起好机器)
三 DISTCC相关思路和验证
四 VLC中使用DISTCC
---
一 解题思路:
首先声明,俺没有学习过并行计算、分布系统、集群等等,只是望文生义一下,shy。。
1 构思:先自己思考把遇到的问题抽象出来,得到真正需求和解决这些问题需要的知识、工具,再去寻找它们。
2 search:前辈的能力和经验是我等小辈最好的学习资源。果然前辈们早已经考虑到这些问题,并且给出解决方法。
---
二 关于利用并行来提速编译的想法(买不起好机器)
自己想了半天,虽然没有用到,还是记录一下:
原先是自己想构造一个辅助编译工具,利用多台机器、服务器分工进行编译,思路如下(一个人brainstorm半天,在稿纸上乱画,这里只简单记录!):
并行级别,初级: 只是利用现有条件加速大工程的生成速度,还不到并行计算资源的层次;
中高级:有GCC-p(我自己命名的并行GCC)分配最基本的可并行计算任务,各个server获取并计算,再将结果返回。
首先当然是先实现初级并行了:
1 公共文件服务器:管理需要被编译的文件、Makefile、其它资源如lib、include等
2 server可以动态增减,需要有一个主任务分配服务器?
3 统一的compiler(版本?lib?)
4 子目录分别编译+整合链接这种方法?(too simple,sometime naive?)
5 各个server的运算能力等级划分+任务权重预计(实现:类似configure之类的基本测试程序,time ./time_consumer??)
6 任务调整+回收+再分配:(有些server任务完成后再次请求分配任务)
7 并行complie script-->Makefile-p;(目前只能手动生产,进一步autoconf-p)
8 server://path/to/libxx.so:(如何解决lib的统一性?间接依赖?)
9 任务分配:登记、完成、取消
10 机器/平台无关?
11 计算请求(忘记什么意思了:囧)
------------
三 DISTCC相关思路和验证
好了,大致知道自己要什么了,去谷歌吧,为什么不是百毒呢?
一不小心,找到这个:http://distcc.samba.org/index.html,也就是我题目中提到的DISTCC,神器啊。。。
当然之前还有这些:
There have been several prior distributed build systems, including pvmmake, doozer, and dmake.
首先说说思路:把编译工作分解成一步一步的,那些cc -E和link等只能本地做的就本地做,cc -S这样的C到汇编可以让别的机器做的就分配出去。虽然思路还是我上面提到的初级并行,但这样十分容易实现,并且不要求编译server需要有同样的编译环境。
(手动试验:写一个依赖本地include和lib的测试程序,或者直接从项目中找一个,做到cc -S之前,再将已经预处理过的c文件放到别的机器上cc -s,看结果:
注意:
1保证头文件和依赖库是别的机器上没有的,其实只关头文件的事。
2 计算各个步骤的大致耗时,这样就能够统计distcc的效果。
3 下面这个只能验证头文件,太简单以至于无法计算耗时。(忽略warning)
4 太简单,但方法如下:
chenee[183]:~/test$ cat a.txt
int i = 5;
chenee[183]:~/test$ cat test.c
#include "a.txt" //(这一步变态了点,小白们要好好学习哈)
int main()
{
printf("i is:%d/n",i);
}
chenee[183]:~/test$ cc -E test.c > test.i
server 端:
chenee@IBM-UBUNTU:/mnt$ cc -S test.i
得到test.s
chenee[183]:/mnt/240$ cc test.s
chenee[183]:/mnt/240$ ./a.out
i is:5
)
---------
四 VLC中使用DISTCC
使用DISTCC,可以到它的网站上看看帮助。
我试验结果:
1 直接apt-get得到的distcc似乎不是那么好用,总是提示failed to distribute等错误,可能是我2台机器的源不一致吧,so,本来想下载源码然后自己改改,没有想到,从源码编译后就可以了。囧,所以,大家遇到apt下来的distcc用不了可以试试自己编译,还是不行的话,可以自己改改代码。
2 make:make -j8 CC='distcc -std=gnu99';
本来网站上推荐的是make -j8 CC=distcc,但是编译过程总是提示错误(shy,被distcc折腾的没力气了,刚开始没有仔细看错误提示!),比较了make -j8 和make -j8 CC=distcc后发现编译命令中少了一个 “-std=gnu99”妈的(玉皇大帝原谅我说脏话),原来VLC的代码是C99的,说白了就是不标准!!!!,比如到处是for(int i=0;i<100;i++),这样的非标准用法,所以必须加上-std=gnu99.否则编译提示错误。
3 编译成功。在configure相同的情况,并且保持make clean后。
使用distcc编译VLC时间如下
$time make
real 12m58.173s
user 3m43.358s
sys 6m13.887s
未使用ditcc编译VLC时间如下:
real 24m13.220s
user 16m3.584s
sys 5m50.786s
4 还有,这里编译VLC是我几乎disable了所有能够disable的选项(configure中)的时间,想想完全编译用多长时间??
类似痛苦的记忆还有tinyX,Qt,kernel。所以大大们赶紧用distcc吧。