使用DISTCC加速VLC的编译

 公司目前用到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吧。

你可能感兴趣的:(使用DISTCC加速VLC的编译)