GNU/Linux >> Linux の 問題 >  >> Linux

複数のコアでコンパイルするときに make がハングする原因は何ですか?

この正確な問題に対する答えはありませんが、何が起こっているのかについてヒントを与えることができます:Makefile の依存関係の欠落。

例:

target: a.bytecode b.bytecode
    link a.bytecode b.bytecode -o target

a.bytecode: a.source
    compile a.source -o a.bytecode

b.bytecode: b.source
    compile b.source a.bytecode -o a.bytecode

make target を呼び出す場合 すべてが正しくコンパイルされます。 a.source のコンパイル が (任意に、しかし決定論的に) 最初に実行されます。次に b.source のコンパイル

しかし、もし make -j2 target 両方 compile コマンドは並行して実行されます。 Makefile の依存関係が壊れていることに実際に気付くでしょう。 2 番目のコンパイルでは a.bytecode を想定しています 既にコンパイルされていますが、依存関係には表示されません。そのため、エラーが発生する可能性があります。 b.bytecode の正しい依存関係行

b.bytecode: b.source a.bytecode

問題に戻ると、運が悪いと、依存関係がないためにコマンドが 100% CPU ループでハングする可能性があります。それがおそらくここで起こっていることです。欠落している依存関係は順次ビルドでは明らかにできませんでしたが、並列ビルドによって明らかになりました。


マシンをどれくらいの期間使用しているかはわかりませんが、最初にメモリ テストを試して、メモリが適切に機能していることを確認することをお勧めします。多くの場合、メモリが問題ではないことはわかっていますが、そうである場合は、他の可能性のある問題を追跡する前に、まず原因としてそれを排除することをお勧めします.


これは非常に古い質問だと思いますが、検索結果の上部にまだ表示されるので、ここに私の解決策を示します:

GNU make には、make とその再帰的な子プロセスが指定された数以上のコアを消費しないようにするジョブサーバー メカニズムがあります:http://make.mad-scientist.net/papers/jobserver-implementation/

すべてのプロセスで共有されるパイプに依存しています。追加の子プロセスをフォークしたい各プロセスは、最初にパイプからトークンを消費し、完了したらトークンを放棄する必要があります。子プロセスが消費したトークンを返さない場合、最上位の make while は返されるのを待って永久にハングします。

https://bugzilla.redhat.com/show_bug.cgi?id=654822

「sed」がGNU sedではないSolarisボックスでGNU makeを使用してbinutilsをビルドすると、このエラーが発生しました。 PATH をいじって sed==gsed をシステム sed より優先させると、問題が修正されました。ただし、sed がパイプからトークンを消費していた理由はわかりません。


Linux
  1. Linuxでpythonプログラムを実行可能にするために何を使用しますか

  2. コンパイル時の -pthread フラグの重要性

  3. コンソール (Ctrl-C) から強制終了されたときに PyQt アプリケーションを終了させる正しい方法は何ですか?

  1. スレッドが分岐するとどうなりますか?

  2. ターミナルを開いたときに、declare -x … 行がすべて表示される原因は何ですか?

  3. 実装時のループデバイスとは?

  1. シェルでファイルを実行するとどうなりますか?

  2. Linux デスクトップがフリーズした場合の対処方法

  3. 特定の Web サイトを閲覧しているときに、Linux が数分間応答しなくなる原因は何ですか?