【问题标题】:How do I make make/ninja limit parallelism based on memory pressure?如何根据内存压力使 make/ninja 限制并行性?
【发布时间】:2017-05-01 15:17:03
【问题描述】:

如果我使用make -j2,它构建得很好,但 CPU 利用率不足:

如果我使用make -j4,它的构建速度很快,但对于某些特定模板繁重的文件,它会消耗大量内存,并且由于换出到 HDD 会减慢整个系统和构建过程:

如何让它根据内存自动限制并行任务的数量,如下所示:

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

想法:

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

【问题讨论】:

  • 你能预测 make 执行的进程会消耗多少内存吗?否则,我无法想象有什么方案能够收敛到最大值,但不通过,也不会造成死锁。
  • 1.它可能是近似的:允许一些未充分利用并允许一些暂时超过最大值。只是不要在内存已满时启动更多任务来加剧问题(但由于整个系统抖动尚未提高平均负载); 2. 它可能会记住以前编译单元的编译单元的典型时间和内存使用情况,并估计它可能与以前没有变化。
  • GNU make 4.2 为其作业服务器提供了一个 API。我认为可以创建一些“守卫”作业,它会根据整体内存使用情况消耗/恢复作业服务器令牌。然后与make -j guardjob ....一起使用,不带-l参数。
  • 嗯...但是如何阻止这样的guardjob?这可能很难......最近我想到的另一个想法是修改 make jobserver 以处理“内存”令牌(例如,一个令牌为 10MB),而不是工作令牌(make.mad-scientist.net/papers/jobserver-implementation)。

标签: memory makefile build parallel-processing


【解决方案1】:

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

  1. 以高 '-j' 值开始 make。

  2. 运行一个警卫工作

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

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

【讨论】:

  • 可以先发制人吗?例如。是否可以让所有链接 (LTO) 作业仅单独运行(例如,在一开始就暂停 then)?
  • 我不确定我是否理解。你是说某些工作不应该在某些内存可用之前开始吗?如果您可以标记这些工作,那么延迟它们就不难了。但我认为问题是关于动态调整,而不是手动控制?
  • 好的,最好把问题集中在自动解决方案上。
  • 问题仍然相关吗?如果您找到替代解决方案 - 我不想占用您的时间
  • 如果你有什么要测试的,我可以测试一下。如果您自己不需要它,则无需专门编写代码来回答这个问题。
猜你喜欢
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-28
  • 2019-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多