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
私は何をすべきか?
(失敗の直後に)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を代わりに実行してください。これにより、並列ジョブが少なくなり、コンパイルに時間がかかりますが、システムメモリを使い果たすことはありません。
(メモリの問題の可能性があります)
まだこれに苦しんでいる人(質問を聞いてから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
次のように入力して、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」を実行すると、スワップ領域が表示されます。
これは、AWS EC2インスタンスでの私のシナリオ(CentOS 7でmesosをコンパイルする)の手がかりでした。
メモリとCPUを少なくとも4GiBと2つのvCPUに増やすことで修正しました。