コンパイル時に誤って多くのスレッドを指定しないようにするにはどうすればよいですか?


2

ものをコンパイルするとき、私は通常これを速くしたいので、私のワークステーションで私は発行します

make -j16

(gnu)makeは16コアでコンパイルを開始します。しかし、ラップトップに戻ったとき、16個のコアはありません。したがって、同じコマンドを発行すると、マシンがフリーズして死にます。CTRL + ALT + F1などを使用して代替端末に切り替えることもできず、リモートログインも成功しません。CTRL + C、CTRL + 4はいずれもみなされません。(ところで:自動メモリ消去などの自動キルは成功しません)その後、マシンの電源をオフにしなければなりません。(カーネル3.0.xでUbuntu 11.10を使用しています)

1つの解決策は、他の「並列」ターゲットが依存し、「make -j $ NUMCORES」を直接使用しない小さなmakeターゲットを使用して、現在のマシンで使用可能なコア数を事前に取得することです。(私はすでにそれを行っており、ブーストスレッドを使用する小さなc ++プログラムで実現しています)。しかし、これにより、誤って「make -j16」を再度指定することから保護されません。

また、「多すぎる」コアは、使用可能なコアと同じ数(スレッドコアを含む)であってはなりません。+ 1スレッドまたは+2スレッドではマシンが停止しないためです。

問題を緩和するためにulimitsを使用できますか?でも、私は0に、スワップ・スペースを設定する指定についてそれから私は私が中止に変化がなければならないと思います


1
最初のソリューションでexport MAKEFLAGS="-j$(nproc)"は、を使用できます。特別なメイクファイルは必要ありません。第二に、alias make="nice ionice make"おそらく?
-grawity

なぜこれを回答として投稿しなかったのですか?ありがとう!
数学

1
実行を妨げないためmake -j16、回復する可能性はわずかです。
-grawity

はい、あなたは正しいです;)、しかし、これは私がこれまで使用した特別なmakeターゲットよりもはるかに優れています!
数学

回答:


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を大量に使用している場合、これによりコンパイルが遅くなることに注意してください。


また、与えられたすべての引数をチェックするラッパースクリプト(またはシェル関数)を作成することもできます。

make() {
    local arg
    for arg; do
        [[ $arg == -j* ]] && {
            echo "Rejecting '$arg' in make args. Use 'command make ...' to bypass."
            return 1
        }
    done
    command make "$@"
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.