制作-j RAM限制

Dri*_*ise 15 makefile

有没有办法强制make -j不要过度消耗我的RAM?我在一个开发团队工作,我们有不同的硬件组,所以-j8可能不适合每个人.但是,make -j对我来说使用太多内存,并溢出到交换中,这可能会占用整个系统.我怎么能避免这个?

理想情况下,我希望make观察系统负载并停止生成新线程,等待一些完成,然后继续.

Chi*_*era 6

稍微简单的解决方案是让每个工作站都有一个适合该硬件可以处理的环境变量。让 makefile 读取此环境变量并将其传递给 -j 选项。如何让 gnu make 读取环境变量。

此外,如果构建过程有很多步骤并且需要很长时间,请make重新读取环境变量,以便在构建过程中可以减少/增加资源使用。

此外,也许在工作站上运行了一个服务/应用程序,它可以监视资源使用情况并修改环境变量,而不是尝试这样make做......

  • 硬件可以处理的内容取决于正在编译的内容,并且无法通过 make -j 进行最佳控制,因为 -j 选项对构建各种类型的源所需的 RAM 使用情况一无所知。例如,-O0 vs -O2 或 C vs C++ 或 GCC vs Intel 编译器。 (2认同)

Kei*_*yne 6

还有另一种方法可以做到这一点:

(来自http://www.gnu.org/software/make/manual/html_node/Parallel.html#Parallel)

当系统负载很重时,您可能希望运行的作业少于轻载时的作业.您可以使用'-l'选项告诉make根据平均负载限制一次运行的作业数.'-l'或'--max-load'选项后跟一个浮点数.例如,

如果负载平均值高于2.5,-l 2.5将不会让make启动多个作业.没有跟随号码的'-l'选项会删除加载限制,前提是前一个'-l'选项.

如果你担心所有的内存都被占用,这可能有所帮助.在这种情况下,"加载"是指正常运行时间或最高报告.如果你正在交换,或者更糟糕的是,捶打,负载将会上升.您可以试验此选项的值.您应该在非并行构建期间观察负载级别,并在增加make的并行进程数时观察.这应该为您的机器提供合理的基线.

  • 这是错的.Load是未阻塞线程的数量.如果您正在进行寻呼,则会被阻止,并且不会显示在加载编号中.在内存不足的情况下,您将进行分页.你会在低内存的情况下开始"更多"的工作,这个建议不是你想要的. (5认同)
  • 无所谓,合理的负载限制应该完全符合您的要求,主要与硬件无关.*我也可以输入斜体*. (2认同)

小智 6

make -j 的作用是否可能存在一些混淆?(至少我错了很长时间......)。我认为不带选项的 -j 会适应 CPU 的数量,但事实并非如此 - 它根本不适用任何限制。这意味着对于大型项目,它将创建大量进程(只需运行“top”即可查看...),并且可能会耗尽所有 RAM。当我的项目的“make -j”使用了我所有的 16Gb RAM 并失败时,我偶然发现了这一点,而“make -j 8”在使用 2.5 Gb RAM 时达到顶峰(在 8 个内核上,负载接近 100%两种情况)。

在效率方面,我认为使用等于或大于您期望的最大 CPU 数的限制比没有限制更有效,因为数千个进程的调度有一些开销。创建的进程总数应该是恒定的,但是由于“-j”一次创建了很多进程,内存分配可能会成为一个问题。即使将限制设置为 CPU 数量的两倍,也应该比根本不设置限制更加保守。

PS:经过更多的挖掘,我想出了一个巧妙的解决方案 - 只需读出处理器的数量并将其用作 -j 选项:

make -j `nproc`
Run Code Online (Sandbox Code Playgroud)