Memory 如何根据内存压力来限制make/ninja的并行性?
如果我使用Memory 如何根据内存压力来限制make/ninja的并行性?,memory,makefile,build,parallel-processing,Memory,Makefile,Build,Parallel Processing,如果我使用make-j2,它构建得很好,但CPU利用率不足: 如果我使用make-j4,它构建速度很快,但对于某些模板繁重的文件,它会消耗大量内存,由于交换到HDD,会减慢整个系统和构建过程: 如何根据内存自动限制并行任务的数量,如下所示: ,以便以最大速度构建项目,但在某些地方会减慢速度以避免撞到内存墙 想法: 使用-l并在内存繁忙时人工调整平均负载(当系统已经出现故障时,平均负载自然增长) 使内存分配系统调用(如sbrk(2)或mmap(2))或页面错误保持进程挂起,直到完成的作业回
make-j2
,它构建得很好,但CPU利用率不足:
如果我使用make-j4
,它构建速度很快,但对于某些模板繁重的文件,它会消耗大量内存,由于交换到HDD,会减慢整个系统和构建过程:
如何根据内存自动限制并行任务的数量,如下所示:
,以便以最大速度构建项目,但在某些地方会减慢速度以避免撞到内存墙
想法:
- 使用
并在内存繁忙时人工调整平均负载(当系统已经出现故障时,平均负载自然增长)-l
- 使内存分配系统调用(如sbrk(2)或mmap(2))或页面错误保持进程挂起,直到完成的作业回收内存,而不是调出其他进程。不幸的是,容易死锁
- 以高'-j'值开始制造
- 执行一项警卫工作 a。等待抖动(页面错误/秒超过限制)和高CPU利用率。 B找到内存使用率最高的作业,将其挂起。 C等待一段时间,让系统重新平衡自身。 D重复
- 不是一个完整的解决方案,而是一种基于“保护”的潜在方法
如果方法看起来不错,可以发布示例实现。您是否能够预测make执行的进程将消耗多少内存?否则,我无法想象任何解决方案能够收敛到最大值,但不能通过它,并且不会导致死锁。1。它可能是近似值:允许一些利用不足,允许一些临时超出最大值。只是不要在内存已满的情况下启动更多任务(但由于整个系统抖动,平均负载尚未提高),从而加剧问题;2.它可能会从以前的编译单元中记住编译单元的典型时间和内存使用情况,并估计可能与以前没有变化。GNU make 4.2为其jobserver提供了一个API。我认为可以创建一些“保护”作业,根据总体内存使用情况使用/恢复jobserver令牌。然后与
make-j guardjob….
一起使用,不与-l
参数一起使用。。。但如何阻止这样一个guardjob
?那可能很难。。。最近我想到的另一个想法是修改makejobserver,使其能够处理“内存”令牌(例如,一个令牌为10MB),而不是作业令牌()。它能先发制人地工作吗?例如,它能否使所有链接(LTO)作业仅单独运行(例如,在一开始就暂停)?我不确定我是否理解。你是说某些作业在特定内存可用之前不应启动吗?如果你能标记这些工作,就不难让它们延迟。但我认为问题是关于动态调整,而不是手动控制?好吧,也许最好把问题集中在自动解决上。这个问题仍然相关吗?如果您找到了替代解决方案-我不想占用您的时间如果您有什么要测试的话,我可能会测试它。如果您自己不需要它,就不需要专门编写代码来回答这个问题。