如何防止自己在编译时意外指定太多线程?


2

当我编译东西时,我通常想快速做到这一点,所以在我的工作站上我发布

make -j16

并且(gnu)make开始使用16个内核进行编译。然而,当我回到我的笔记本电脑上时,那里没有16个核心。因此,当我发出相同的命令时,我的机器冻死了。我不能通过CTRL + ALT + F1等切换到备用终端,也不能成功远程登录。 CTRL + C,CTRL + 4都不会被视为。 (顺便说一句:没有自动杀死会成功,例如自动内存不足)我必须关闭机器电源。 (我使用Ubuntu 11.10和内核3.0.x)

一种解决方案是提前获得当前机器上可用的核心数量,其中包含任何其他“并行”目标所依赖的小型制造目标,并且不直接使用“make -j $ NUMCORES”。 (我已经完成了这一点,并使用一个使用boost线程的小型c ++程序实现)。但这不会保护我不会再意外地指定“make -j16”。

“太多”核心也不能与可用核心数量相同(包括线程核心),因为+1或+2线程仍然不会杀死机器。

我可以使用ulimits来缓解这个问题吗?我虽然指定将交换空间设置为0.然后我应该改变中止我 猜测


1
对于第一个解决方案, export MAKEFLAGS="-j$(nproc)" 可以用;不需要特殊的makefile。对于第二个, alias make="nice ionice make" 也许?
grawity

你为什么不发布这个答案?谢谢!
math

1
因为它没有 防止 你从跑步 make -j16,它只有一点恢复的机会。
grawity

是的你是对的;),然而这比我迄今为止使用的特殊制作目标要好得多!
math

Answers:


5

您无需编写任何特殊的Makefile来确定核心数量;可以在环境和Linux中指定默认标志 的coreutils 附带一个名为的工具 nproc

export MAKEFLAGS="-j$(nproc)"

如果 nproc 在您的系统中不存在,另一种选择(也仅适用于Linux) getconf

export MAKEFLAGS="-j$(getconf _NPROCESSORS_ONLN)"

可以通过运行来完成对完全冻结的部分保护 make (以及整个构建过程)在低CPU和IO优先级下:

alias make="nice ionice make"

但请注意,如果其他进程同时大量使用磁盘IO或CPU,则会降低编译速度。


您还可以编写一个包装脚本(或shell函数)来检查给它的所有参数:

make() {
    local arg
    for arg; do
        [[ $arg == -j* ]] && {
            echo "Rejecting '$arg' in make args. Use 'command make ...' to bypass."
            return 1
        }
    done
    command make "$@"
}
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.