如何根据内存压力使make/ninja限制并行度?

Vi.*_*Vi. 16 memory parallel-processing makefile build

如果我使用make -j2它,它构建良好,但利用不足的CPU:

J2

如果我使用make -j4它,它会快速构建,但是对于某些特定模板的文件,它会消耗大量内存,从而减慢整个系统和构建过程,因为交换到HDD:

J4

如何使其根据内存自动限制并行任务数,如下所示:

在此输入图像描述

,以便以最大速率建立项目,但在某些地方放慢速度以避免撞到内存墙?

思路:

  • -l如果内存繁忙,请使用并人为调整负载平均值(当系统出现问题时,负载平均值会自然增长).
  • 使内存分配系统调用(如sbrk(2)或mmap(2))或页面错误保持进程挂起,直到内存被完成的作业回收,而不是交换其他进程.不幸的是,死锁很容易......

das*_*h-o 2

这不是一个完整的解决方案,而是一种基于“守卫”的潜在方法。

  1. 以高“-j”值开始 make。

  2. 运行一个警卫工作

    A。等待抖动(页面错误/秒超过限制)和高 CPU 利用率。b. 找到内存使用率最高的作业,将其挂起。C。等待一段时间,让系统自行重新平衡。d. 重复

如果该方法看起来不错,可以发布示例实现。

  • 可以先发制人吗?例如,它可以使所有链接(LTO)作业仅单独运行(例如,通过在一开始就暂停)? (2认同)
  • 好吧,也许最好将问题集中在自动解决方案上。 (2认同)