前言
CMake是跨平台免费和开源软件,使用独立编译器的方法构建软件的自动化、测试、包装和安装。 CMake 不是构建系统,而是生成另一个系统的构建文件。
CMake生成Makefile后,make时通常会用-j
选项配置多个线程进行编译。
之前,我以为Make真的不亏时久经考验的构建工具,既然服务器资源多,那就多设置些线程编译make -j 128
。然而,看群里讨论,发现编译的线程并不是越多越好。可以类比逻辑斯蒂曲线。
设置一个经验值
那么这个经验值make -j $NPROC
怎么设置呢?可以参考下面的公式。
NPROC=$(nproc=`cat /proc/cpuinfo | grep processor | grep -v processors | wc -l`; if [ $nproc -gt 24 ]; then nproc=`expr 24 + $nproc / 10`; fi; echo $nproc)
解释一下,在linux系统中,提供了/proc目录下文件,显示系统的软硬件信息。可以查/proc/cpuinfo,了解系统中CPU的提供商和相关配置信息。
nproc=`cat /proc/cpuinfo | grep processor | grep -v processors | wc -l`
前面nproc获取的是逻辑CPU的个数。
要是超过24(经验值),那还能再往机器要些资源,再提高一点并发度;加多少呢? 比如100个逻辑CPU,那么再加10(100/10
):差不多30多个线程编译的效果和设置100差不多了。
原因探究
- make任务本身拆分不了这么多(如上,100来个)编译子任务。
- 线程越多,同步的消耗也越大。
- 同样多线程,本身占用资源也多,不能超过物理内存上限。