`make -j`(没有参数)危险吗?

Exp*_* HP 14 make out-of-memory

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

$ make -j
Run Code Online (Sandbox Code Playgroud)

也许是出于与其他软件的习惯,如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
Run Code Online (Sandbox Code Playgroud)

所以我检查了 GNU make 的手册页:(强调)

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


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

make -j我觉得的那么危险吗? 如果是这样,它到底为什么在那里,并且可以做些什么来证明它是白痴?

Kus*_*nda 5

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

make -j在一个小项目上运行是完全合理的。在其他项目中,-j不带参数使用会严重削弱系统响应能力。在某些项目中,使用并行构建,即使使用-j2,也会完全破坏构建(由并行构建过程创建的文件没有及时用于另一个等)。

我会亲自避免混淆makemake -j4(因为你说你正在考虑,在评论)。我发现最好明确告诉机器要做什么,这样我就知道它会做什么。几天后,我会忘记那个别名,并想知​​道为什么我在不同终端中构建的四个项目使我的系统没有响应。

至于“危险”……这个词在不同的语境下有不同的含义。是的,它是“危险的”,因为它可能会使系统无响应。是的,它是“危险的”,因为它很可能在构建过程中途崩溃。但是,不,它不是“危险的”,因为它会重新格式化您的硬盘驱动器或开始删除随机文件。

那么,如何防白痴呢?

这是一个万无一失的分步指南:

  1. 学会使用你的工具。

-j还要注意,BSD的标志make 确实需要一个参数,而且这个标志是非标准的(Unix POSIX 标准没有提到它)。


Zit*_*rax 5

您还可以使用以下命令限制 make -l

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

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

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