【发布时间】: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