GNU'make -j'会导致CPU高负载和桌面无响应

问题描述:

我正在使用4核cpu的kubuntu 10.10。当我使用'make -j2'来构建cpp项目时,2核心的使用率成为100%,桌面环境变得没有反应,并且构建过程没有进展。GNU'make -j'会导致CPU高负载和桌面无响应

版本信息:

The GNU make's version is 3.81 
gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5) 

如何解决这个问题呢?谢谢。

+0

它是超线程还是4核物理内核? – 2012-02-16 06:01:18

+0

@JesusRamos我相信它是4个物理核心:) – 2012-02-16 06:53:30

+0

它只发生在Ubuntu上吗?由于正在使用2个内核,因此您的桌面应该仍然非常敏感 – 2012-02-17 05:09:45

这里没有足够的信息给你一个明确的答案。首先不清楚这是否仅在使用-j2运行时才会发生。如果你没有平行运行(no -j)会怎么样?当你说“2核的CPU使用率[达到] 100%”时,这些CPU上发生了什么?如果您在另一个终端上运行“顶部”,然后开始构建,顶部显示的是什么?

或者,如果您运行“make -d -j2”,在CPU达到100%之前,哪个程序正在运行?

由于您有4个内核,只有2个处于繁忙状态,因此桌面无响应以及提示出现其他问题而非CPU使用情况。也许有东西咀嚼所有的RAM?系统会在一段时间后回来(表示OOM杀手参与并踩踏某物)?

如果这些都没有帮助,你可以在strace下运行make,就像“strace -f make -j2”,看看你是否能弄清楚发生了什么。这会产生一两或两个输出,但是如果在CPU挂起时,你会看到一遍又一遍的重复,你可能会得到一个提示。

基本上我可以看到这些可能性:

  1. 这不是让所有,而是任何make命令正在运行,这只是使你的系统崩溃。你暗示它只是编译C++代码,所以看起来似乎不太可能,除非在某个地方有bug。
  2. Make正在无限递归。 Make将重建自己的makefile,加上任何包含的makefile,然后重新自行执行。如果你不小心定义包括makefile在内的重建规则,make可以决定它们总是过时并且永远重建/ rexec。
  3. 别的东西

希望上面的提示将设置你发现这是怎么回事的道路。

您确定该项目已准备好进行并行编译吗?也许先决条件没有正确排序。

如果您只用“make”编译完成了项目?如果到最后是目标依赖问题。