make -j(不带参数)是否危险?[关闭]


13

今天早些时候,建设东西的时候,我决定运行make

$ make -j

也许是出于与其他软件的习惯,如cabal其中-j默认为一个合理的限度。

大约20秒后,我的整个桌面都停了下来。我寻找各种活动迹象。没有风扇旋转。HDD指示灯呈绿色常亮,但是我听不到磁盘活动。沉默了10分钟之后,我终于看到了对我几年前做出的第一次按键的反应,并且我也开始听到人们耳熟能详的磁盘颠簸声。20分钟后,我慢慢尝试涉足这台无响应机器上的终端,然后我倒下并使用了REISUB。


起初,我认为一个不相关的桌面应用程序一定是罪魁祸首,因为我早就在交互式bash会话中设置内存限制,以防止我陷入这种情况!但/var/log/syslog讲述了一个不同的故事; 在OOM杀手留下一些ps垃圾场被怀疑的包装c++cc1plus流程!

这是其中一个转储的频率分析:

Command          Number of appearances
'sh'                    322
'c++'                   321
'cc1plus'               321
'chrome'                 27
'make'                   27
'bash'                    3
all else combined       120

因此,我检查了GNU make的手册页:(添加了重点)

-j [jobs],--jobs [= jobs]指定要同时运行的作业(命令)数。如果有多个-j选项,则最后一个有效。 如果给-j选项不带参数,make将不会限制可以同时运行的作业数量。


我不愿意看到我是否能重现该问题(医生,我这样做时,它会伤害这个 ...) ,但调查的结果似乎到目前为止是一个本垒打:显然,make -j与数百产生过程必须有是挂起和磁盘抖动的原因。也就是说,在互联网上搜索时,我找不到很多警告。我在得出结论吗?

make -j因为危险的,因为它似乎给我吗? 如果是这样,为什么在地球上呢?如何对它进行白痴验证?


注意:关于最后一个问题,我正在考虑添加,alias make="make -j4"以消除添加参数的需要-jN,但是我仍然没有考虑所有可能的结果...
Exp HP

1
对于全局限制,请使用make自己的设施并执行export MAKEFLAGS="-j 4"。为了进一步调查, 建议您 打字之前先阅读 。PS:<内核数> + 2已经为我服务了近二十年。当时,Linus 在发布内核之前进行了决赛。 make -j128
Bananguin

Answers:


6

有一些工具可让您以许多富于想象力的方式射击自己的脚。这样,您就可以利用自己的想象力来解决问题,而不受他人认为“理智”的限制。

make -j在一个小项目上运行是完全合理的。在其他项目中,-j不加争论地使用将严重削弱系统的响应能力。在某些项目中,即使使用-j2,也使用并行构建会完全破坏构建(由并行make进程创建的文件无法及时存入另一个文件等)。

我会亲自避免混淆makemake -j4(因为你说你正在考虑,在评论)。我发现最好明确告诉机器要做什么,这样我才能知道它将要做什么。再过几天,我会忘记这个别名,并且想知道为什么我在单独的终端中构建的四个项目使我的系统无响应。

至于“危险”……这个词在不同的语境下意味着不同的事物。是的,它是“危险的”,因为它可能会使系统无响应。是的,它是“危险的”,因为它很可能在构建过程中途破坏构建过程。但是不,从某种意义上讲它会重新格式化硬盘或开始删除随机文件并不“危险”。

那么,如何防止白痴呢?

这是一个surefire分步指南:

  1. 学习使用您的工具。

-j还要注意,BSD 的标志make 确实需要一个参数,并且该标志是非标准的(Unix POSIX标准未提及)。


4

您还可以限制使用的make -l

-l [load],--load-average [= load]指定如果有其他作业正在运行且平均负载至少为load(浮点数),则不应启动任何新作业(命令)。不带参数时,删除先前的负载限制。

但要注意,它似乎并没有帮助,像这样运行:make -j -l4

在平均负载超出限制之前(根据我的经验)开始了太多的工作。因此,组合可以起作用,例如make -j8 -l4

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.