如何停止 make -jN 消耗太多内存?

Posted

技术标签:

【中文标题】如何停止 make -jN 消耗太多内存?【英文标题】:How to stop make -jN consuming too much memory? 【发布时间】:2015-02-14 13:13:35 【问题描述】:

我有一个构建,如果我使用 make -j2,它会在 20 分钟内完成。

如果我使用make -j3,它会在 15 分钟内完成。但是有时使用make -j3 编译器会崩溃,因为使用了太多的系统内存。有没有办法告诉编译器在内存不足时限制其实例以防止这种情况发生?

【问题讨论】:

我也遇到了同样的问题。不过,我怀疑会有办法。这个功能听起来很复杂。如何事先知道他们将消耗多少 RAM? 如果是编译器占用了太多内存,那么这与 make 无关。您必须查看编译器标志以查看是否有任何控制内存使用的标志。副手我不知道,但我从来没有专门寻找过。您应该确保使用-pipe 标志;除此之外我不知道。 我从来没有遇到过这个问题,即使使用 make -j8 也是如此(在这一点上,即使在具有超线程的 4 核机器上,开销也开始超过好处)。你能告诉我们更多关于你正在“制作”的程序吗?你确定它是使用内存的 gcc 还是你可能正在执行一些其他处理?是否有特别大的源文件,或不寻常的选项,例如内联具有较大的最大函数长度等(在 gcc 手册中查找“指数”和“非线性”)? 啊,“killed”将成为OOM杀手。添加更多内存或交换。如果你不能......那就不要这样做。 我想你可以写一个包装器,它接受任何命令作为它的参数,执行它,但是一旦它的内存消耗超过给定的限制就停止它(kill -STOP),并且总内存消费也超过了给定的限制;并在总内存消耗下降后继续(kill -CONT)它。然后您可以将SHELL 变量更改为该命令。 【参考方案1】:

GNU parallel 可用于根据大量条件启动任务,其中一个条件是剩余足够的可用内存。

【讨论】:

以上是关于如何停止 make -jN 消耗太多内存?的主要内容,如果未能解决你的问题,请参考以下文章

ejabberd 宣布全部时消耗太多内存

mysql时该如何估算内存的消耗,公式如何计算?

Java程序的内存消耗问题

Pushsharp - APNS 服务在约 12 小时后消耗内存并死亡

使用 yaml-cpp 解析 YAML 时的内存消耗

如何跟踪android应用程序消耗的峰值内存