关于Make编译进程数设置的经验值

1,198 阅读1分钟

前言

CMake是跨平台免费和开源软件,使用独立编译器的方法构建软件的自动化、测试、包装和安装。 CMake 不是构建系统,而是生成另一个系统的构建文件。

CMake生成Makefile后,make时通常会用-j选项配置多个线程进行编译

之前,我以为Make真的不亏时久经考验的构建工具,既然服务器资源多,那就多设置些线程编译make -j 128。然而,看群里讨论,发现编译的线程并不是越多越好。可以类比逻辑斯蒂曲线。

image.png

设置一个经验值

那么这个经验值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差不多了。

原因探究

  1. make任务本身拆分不了这么多(如上,100来个)编译子任务。
  2. 线程越多,同步的消耗也越大。
  3. 同样多线程,本身占用资源也多,不能超过物理内存上限。