web-dev-qa-db-ja.com

make -j 8 g ++:内部コンパイラエラー:強制終了(プログラムcc1plus)

Apache MesosをUbuntu12.04にデプロイすると、公式ドキュメントに従います。「make -j 8」のステップで、コンソールにこのエラーが表示されます。

g++: internal compiler error: Killed (program cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See <file:///usr/share/doc/gcc-4.9/README.Bugs> for instructions.
make[2]: *** [slave/containerizer/mesos/libmesos_no_3rdparty_la-containerizer.lo] Error 1
make[2]: *** Waiting for unfinished jobs....
mv -f log/.deps/liblog_la-log.Tpo log/.deps/liblog_la-log.Plo
mv -f slave/containerizer/.deps/libmesos_no_3rdparty_la-docker.Tpo slave/containerizer/.deps/libmesos_no_3rdparty_la-docker.Plo
mv -f log/.deps/liblog_la-consensus.Tpo log/.deps/liblog_la-consensus.Plo

mv -f slave/containerizer/.deps/libmesos_no_3rdparty_la-external_containerizer.Tpo slave/containerizer/.deps/libmesos_no_3rdparty_la-external_containerizer.Plo
mv -f log/.deps/liblog_la-coordinator.Tpo log/.deps/liblog_la-coordinator.Plo
mv -f slave/.deps/libmesos_no_3rdparty_la-slave.Tpo slave/.deps/libmesos_no_3rdparty_la-slave.Plo
mv -f master/.deps/libmesos_no_3rdparty_la-master.Tpo master/.deps/libmesos_no_3rdparty_la-master.Plo
make[2]: Leaving directory `/root/Mesos/mesos/build/src'
make[1]: *** [all] Error 2
make[1]: Leaving directory `/root/Mesos/mesos/build/src'
make: *** [all-recursive] Error 1

私は何をすべきか?

24
pugna

(失敗の直後に)dmesgを実行してみてください。

このような線が見えますか?

Out of memory: Kill process 23747 (cc1plus) score 15 or sacrifice child
Killed process 23747, UID 2243, (cc1plus) total-vm:214456kB, anon-rss:178936kB, file-rss:5908kB

おそらくそれがあなたの問題です。 make -j 8を実行すると、より多くのメモリを使用する多くのプロセスが実行されます。上記の問題は、システムのメモリが不足すると発生します。この場合、システム全体が転倒するのではなく、オペレーティングシステムがプロセスを実行して、システム上の各プロセスをスコアリングします。最高のスコアを獲得したものは、オペレーティングシステムによって強制終了され、メモリが解放されます。強制終了されたプロセスがcc1plusである場合、gccは(おそらく誤って)これをプロセスのクラッシュと解釈し、コンパイラのバグであると想定します。しかし、実際にはそうではなく、問題はクラッシュするのではなく、OSがcc1plusを殺したことです。

この場合、メモリが不足しています。したがって、おそらくmake -j 4を代わりに実行してください。これにより、並列ジョブが少なくなり、コンパイルに時間がかかりますが、システムメモリを使い果たすことはありません。

52
Jon Combe

(メモリの問題の可能性があります)

まだこれに苦しんでいる人(質問を聞いてから2年以上)には、CryptoCurrencyTalkで このトリック が機能しているようです。

便宜上、ここに貼り付けています。

これらを実行する

  • Sudo dd if=/dev/zero of=/swapfile bs=64M count=16
  • Sudo mkswap /swapfile
  • Sudo swapon /swapfile

これでコードをコンパイルできます。 しかし、コンパイル後にswaponを必ず元に戻すようにしてください。

  • Sudo swapoff /swapfile
  • Sudo rm /swapfile
12
ribbit

次のように入力して、CentOSインストールで既にスワップが有効になっているかどうかを確認します。

Sudo swapon --show

出力が空の場合、システムのスワップ領域が有効になっていないことを意味します。

スワップファイルの作成

1.スワップスペースとして使用されるファイルを作成します。カウントは1024M * 1024 = 1Gを意味します

Sudo dd if=/dev/zero of=/swapfile bs=1024 count=1048576

2. rootユーザーのみがスワップファイルを読み書きできるようにします。

Sudo chmod 600 /swapfile

3.ファイルにLinuxスワップ領域を設定します

Sudo mkswap /swapfile

4.スワップを有効にする

Sudo swapon /swapfile

5.「Sudo swapon --show」または「Sudo free -h」を実行すると、スワップ領域が表示されます。

2
Li Yingjun

これは、AWS EC2インスタンスでの私のシナリオ(CentOS 7でmesosをコンパイルする)の手がかりでした。

メモリとCPUを少なくとも4GiBと2つのvCPUに増やすことで修正しました。

1
Traiano Welcome