`make -j`(引数なし)は危険ですか?[閉まっている]


13

今日何かを構築するとき、私は次のように実行することにしmakeました

$ make -j

おそらくcabal-jデフォルトが妥当な制限に設定されている場合など、他のプログラムとは習慣がない。

約20秒後、デスクトップ全体が停止して停止します。活動のさまざまな兆候を探します。ファンは回転しません。HDDライトは緑色に点灯していますが、ディスクアクティビティが聞こえません。うーん。10分の沈黙の後、ようやく何年も前に行った最初のキー操作に対する応答がわかり、ディスクのスラッシングのあまりにも馴染みのある音も聞こえ始めます。20分後、この応答しないマシンの端末にゆっくりと進もうとすると、私は陥没してREISUBを使用しました。


最初は、関係のないデスクトップアプリケーションが原因であると考えました。これは、長い間、インタラクティブなbashセッションメモリ制限を課して、このような状況に身を置くことができなかったためです。しかし/var/log/syslog、別の話をします。OOMキラーは、疑わしくパックされ、処理さているいくつかのpsダンプを残しました!c++cc1plus

これらのダンプの1つの周波数分析を次に示します。

Command          Number of appearances
'sh'                    322
'c++'                   321
'cc1plus'               321
'chrome'                 27
'make'                   27
'bash'                    3
all else combined       120

だから私はGNU makeのmanページをチェックします:(強調を追加)

-j [jobs]、-jobs [= jobs]同時に実行するジョブ(コマンド)の数を指定します。-jオプションが複数ある場合は、最後のオプションが有効です。 引数なしで-jオプションを指定した場合、makeは同時に実行できるジョブの数を制限しません。


私は、問題を再現できるかどうかを確認するには消極的だ(私が行うとき、それは痛い、医師をこれを ...)が、調査の結果は、これまでにホームランのように見える:明らかに、make -jそして得られたプロセスの数百人が持っている必要がありますとなってハングし、ディスクスラッシングの原因。そうは言っても、インターネットを検索しても、それに対する警告はあまりわかりません。私は結論に飛びついていますか?

make -j、それは私には思われるほど危険な? もしそうなら、なぜそこにあるのですか、そしてそれをばか者に証明するために何ができるでしょうか?


注:最後の質問では、引数を追加alias make="make -j4"する必要をなくすためにを追加することを検討してい-jNますが、考えられるすべての結果をまだ考えていません...
Exp HP

1
グローバルな制限については、make独自の施設を使用してくださいexport MAKEFLAGS="-j 4"。さらなる調査 については、入力する前に読むことをお 勧めし ます。PS:<コアの数> + 2は、ほぼ20年間、私によく役立ちました。当時、Linusはカーネルをリリースする前に決勝戦を行いました。 make -j128
Bananguin 2017

回答:


6

想像力を駆使してさまざまな方法で足を撃つことができるツールがあります。これは、他の誰かが「正気」であると考えるものに制限されることなく、想像力を使って問題を解決できるようにするためです。

make -j小さなプロジェクトで実行することは完全に合理的です。他のプロジェクトでは-j、引数なしで使用すると、システムの応答性が大幅に低下します。一部のプロジェクトでは、並列ビルドを使用しても-j2、ビルドが完全に中断されます(並列makeプロセスで作成されたファイルが別の時間に間に合わないなど)。

私は個人的には(あなたが言っているように、コメントで)エイリアスmakeを付けないようmake -j4にします。私はそれが明示的に私がそうすることを、何をすべきか、マシンを伝える方が良いでしょうことを見つける知っている、それが何をしますか。数日のうちに、そのエイリアスを忘れてしまいます。別の端末で構築している4つのプロジェクトが原因でシステムが応答しなくなったのはなぜでしょうか。

「危険」とは…文脈によって意味が違う。はい、システムが応答しなくなる可能性があるため、「危険」です。はい、ビルドの途中でビルドプロセスがクラッシュする可能性があるため、「危険」です。ただし、ハードドライブを再フォーマットしたり、ランダムファイルの削除を開始したりするという意味では、「危険」ではありません。

それで、それを馬鹿にするにはどうすればいいですか?

ここに確実なステップバイステップガイドがあります:

  1. ツールの使い方を学びます。

また、-jBSD に対するフラグには引数make 必要であり、このフラグは非標準であることにも注意してください(Unix POSIX標準では言及されていません)。


4

makeを使用して制限することもできます-l

-l [load]、-load-average [= load]他に実行中のジョブがあり、平均負荷が少なくともロード(浮動小数点数)の場合、新しいジョブ(コマンド)を開始しないことを指定します。引数なしで、以前のロード制限を削除します。

ただし、次のように実行しても役に立たないようですmake -j -l4

負荷平均が制限を超える前に開始されたジョブが多すぎます(私の経験に基づく)。したがって、組み合わせが機能しmake -j8 -l4ます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.