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
我觉得的那么危险吗? 如果是这样,它到底为什么在那里,并且可以做些什么来证明它是白痴?
有一些工具可以让您以多种富有想象力的方式用脚射击自己。这样你就可以发挥你的想象力来解决问题,而不受其他人认为“理智”的限制。
make -j
在一个小项目上运行是完全合理的。在其他项目中,-j
不带参数使用会严重削弱系统响应能力。在某些项目中,使用并行构建,即使使用-j2
,也会完全破坏构建(由并行构建过程创建的文件没有及时用于另一个等)。
我会亲自避免混淆make
到make -j4
(因为你说你正在考虑,在评论)。我发现最好明确告诉机器要做什么,这样我就知道它会做什么。几天后,我会忘记那个别名,并想知道为什么我在不同终端中构建的四个项目使我的系统没有响应。
至于“危险”……这个词在不同的语境下有不同的含义。是的,它是“危险的”,因为它可能会使系统无响应。是的,它是“危险的”,因为它很可能在构建过程中途崩溃。但是,不,它不是“危险的”,因为它会重新格式化您的硬盘驱动器或开始删除随机文件。
那么,如何防白痴呢?
这是一个万无一失的分步指南:
-j
还要注意,BSD的标志make
确实需要一个参数,而且这个标志是非标准的(Unix POSIX 标准没有提到它)。
您还可以使用以下命令限制 make -l
:
-l [load], --load-average[=load] 指定如果有其他作业正在运行且平均负载至少为 load(浮点数),则不应启动新作业(命令)。不带参数,删除先前的负载限制。
但请注意,像这样运行它似乎没有帮助:make -j -l4
。
在平均负载超过限制之前启动了太多作业(根据我的经验)。因此,组合可以起作用,例如make -j8 -l4
。
归档时间: |
|
查看次数: |
5348 次 |
最近记录: |