linux编译命令:tmpfs,make,distcc,ccache
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
linux编译命令:tmpfs,make,distcc,ccache
项⽬越来越⼤,每次需要重新编译整个项⽬都是⼀件很浪费时间的事情。
Research了⼀下,找到以下可以帮助提⾼速度的⽅法,总结⼀下。
tmpfs
有⼈说在Windows下⽤了RAMDisk把⼀个项⽬编译时间从4.5⼩时减少到了5分钟,也许这个数字是有点夸张了,不过粗想想,把⽂件放到内存上做编译应该是⽐在磁盘上快多了吧,尤其如果编译器需要⽣成很多临时⽂件的话。
这个做法的实现成本最低,在Linux中,直接mount⼀个tmpfs就可以了。
⽽且对所编译的⼯程没有任何要求,也不⽤改动编译环境。
mount -t tmpfs tmpfs ~/build -o size=1G
⽤2.6.32.2的Linux Kernel来测试⼀下编译速度:
⽤物理磁盘:40分16秒
⽤tmpfs:39分56秒
呃……没什么变化。
看来编译慢很⼤程度上瓶颈并不在IO上⾯。
但对于⼀个实际项⽬来说,编译过程中可能还会有打包等IO密集的操作,所以只要可能,⽤tmpfs是有益⽆害的。
当然对于⼤项⽬来说,你需要有⾜够的内存才能负担得
起这个tmpfs的开销。
make -j
既然IO不是瓶颈,那CPU就应该是⼀个影响编译速度的重要因素了。
⽤make -j带⼀个参数,可以把项⽬在进⾏并⾏编译,⽐如在⼀台双核的机器上,完全可以⽤make -j4,让make最多允许4个编译命令同时执⾏,这样可以更有效的利⽤CPU资源。
还是⽤Kernel来测试:
⽤make: 40分16秒
⽤make -j4:23分16秒
⽤make -j8:22分59秒
由此看来,在多核CPU上,适当的进⾏并⾏编译还是可以明显提⾼编译速度的。
但并⾏的任务不宜太多,⼀般是以CPU的核⼼数⽬的两倍为宜。
不过这个⽅案不是完全没有cost的,如果项⽬的Makefile不规范,没有正确的设置好依赖关系,并⾏编译的结果就是编译不能正常进⾏。
如果依赖关系设置过于保守,则可能本⾝编译的可并⾏度就下降了,也不能取得最佳的效果。
超线程技术的原理很简单,以前的单核⼼处理器,在同⼀时间内只可以处理⼀项⼯作 (线程,Thread),如果要处理⼀项以上的⼯作时,以前的单核⼼处理器是不可⾏的,所以英特尔就开发了超线程技术,以⼀个单核⼼的处理器,去模拟出双核⼼的环境,但这并⾮能够在奔腾四时代INTEL就已经引⼊了⼈超线程技术,⽽特意的加长的流⽔线反⽽成了HT技术的累赘。
所以推出奔腾D及后来的酷睿2系列时,英特尔并没有加进超线程技术,因为奔腾D及酷睿2处理器已⽀援双核⼼处理器的运作,⽽且INTEL也在默默的钻研指令预测技术减少流⽔线。
在酷睿2后期英特尔推出了酷睿2四核⼼处理器,因为有⽤户反映双核不⾜以应付⼿头其实超线程技术拥有最⾼的功耗效能⽐,加⼊超线程技术所增加的晶体管数⽬及功耗并不多,但却相⽐增加⼀颗完整的核⼼更具性价⽐,加上酷睿i7微架构拥有⾼带宽及⾼容量三级⾼速缓存的优势,更能将超线程技术的功效发挥到极致。
要打开超线程技术,很简单,⼀般⽽⾔,在BIOS内就可以设定超线程技术的启动与否。
当设定完成后,进⼊Windows的“我的电脑”,查看处理器,就能看出⼋个线程的⼯作情况。
加⼊超线程技术的英特尔酷睿i7处理器在多任务应⽤时最能发挥它的潜能,它可以同时处理N个的游戏及多媒体软件,⽽不会出现慢式死机。
有⼈做了⼀些评测,是⽤Cinebench 10,跑Far Cry 2 及Company of Heroes来测试有打开超线程技术与没有开启的性能的区别ccache
ccache⽤于把编译的中间结果进⾏缓存,以便在再次编译的时候可以节省时间。
这对于玩Kernel来说实在是再好不过了,因为经常需要修改⼀些Kernel的代码,然后再重新编译,⽽这两次编译⼤部分东西可能都没有发⽣变化。
对于
平时开发项⽬来说,也是⼀样。
为什么不是直接⽤make所⽀持的增量编译呢?还是因为现实中,因为Makefile的不规范,很可能这种“聪明”的⽅案根本不能正常⼯作,只有每次make clean再make才⾏。
安装完ccache后,可以在/usr/local/bin下建⽴gcc,g++,c++,cc的symbolic link,链到/usr/bin/ccache上。
总之确认系统在调⽤gcc等命令时会调⽤到ccache就可以了(通常情况下/usr/local/bin会在PATH中排在/usr/bin前⾯)。
继续测试:
⽤ccache的第⼀次编译(make -j4):23分38秒
⽤ccache的第⼆次编译(make -j4):8分48秒
⽤ccache的第三次编译(修改若⼲配置,make -j4):23分48秒
看来修改配置(我改了CPU类型…)对ccache的影响是很⼤的,因为基本头⽂件发⽣变化后,就导致所有缓存数据都⽆效了,必须重头来做。
但如果只是修改⼀些.c⽂件的代码,ccache的效果还是相当明显的。
⽽且使⽤ccache对项
⽬没有特别的依赖,布署成本很低,这在⽇常⼯作中很实⽤。
可以⽤ccache -s来查看cache的使⽤和命中情况:
cache directory /home/lifanxi/.ccache
cache hit 7165
cache miss 14283
called for link 71
not a C/C++ file 120
no input file 3045
files in cache 28566
cache size 81.7 Mbytes
max cache size 976.6 Mbytes
可以看到,显然只有第⼆编次译时cache命中了,cache miss是第⼀次和第三次编译带来的。
两次cache占⽤了81.7M的磁盘,还是完全可以接受的。
distcc
⼀台机器的能⼒有限,可以联合多台电脑⼀起来编译。
这在公司的⽇常开发中也是可⾏的,因为可能每个开发⼈员都有⾃⼰的开发编译环境,它们的编译器版本⼀般是⼀致的,公司的⽹络也通常具有较好的性能。
这时就是distcc⼤显
⾝⼿的时候了。
使⽤distcc,并不像想象中那样要求每台电脑都具有完全⼀致的环境,它只要求源代码可以⽤make -j并⾏编译,并且参与分布式编译的电脑系统中具有相同的编译器。
因为它的原理只是把预处理好的源⽂件分发到多台计算机上,预
处理、编译后的⽬标⽂件的链接和其它除编译以外的⼯作仍然是在发起编译的主控电脑上完成,所以只要求发起编译的那台机器具备⼀套完整的编译环境就可以了。
distcc安装后,可以启动⼀下它的服务:
/usr/bin/distccd --daemon --allow 10.64.0.0/16
默认的3632端⼝允许来⾃同⼀个⽹络的distcc连接。
然后设置⼀下DISTCC_HOSTS环境变量,设置可以参与编译的机器列表。
通常localhost也参与编译,但如果可以参与编译的机器很多,则可以把localhost从这个列表中去掉,这样本机就完全只是进⾏预处理、分发和链接了,编译
都在别的机器上完成。
因为机器很多时,localhost的处理负担很重,所以它就不再“兼职”编译了。
export DISTCC_HOSTS="localhost 10.64.25.1 10.64.25.2 10.64.25.3"
然后与ccache类似把g++,gcc等常⽤的命令链接到/usr/bin/distcc上就可以了。
在make的时候,也必须⽤-j参数,⼀般是参数可以⽤所有参⽤编译的计算机CPU内核总数的两倍做为并⾏的任务数。
同样测试⼀下:
⼀台双核计算机,make -j4:23分16秒
两台双核计算机,make -j4:16分40秒
两台双核计算机,make -j8:15分49秒
跟最开始⽤⼀台双核时的23分钟相⽐,还是快了不少的。
如果有更多的计算机加⼊,也可以得到更好的效果。
在编译过程中可以⽤distccmon-text来查看编译任务的分配情况。
distcc也可以与ccache同时使⽤,通过设置⼀个环境变量就可以做到,⾮常⽅便。
总结⼀下:
tmpfs:解决IO瓶颈,充分利⽤本机内存资源
make -j:充分利⽤本机计算资源
distcc:利⽤多台计算机资源
ccache:减少重复编译相同代码的时间
这些⼯具的好处都在于布署的成本相对较低,综合利⽤这些⼯具,就可以轻轻松松的节省相当可观的时间。
上⾯介绍的都是这些⼯具最基本的⽤法,更多的⽤法可以参考它们各⾃的man page。