make -j 8 g++: внутренняя ошибка компилятора: Killed (программа 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
что я должен делать?
3 ответа
Попробуйте запустить (сразу после сбоя) 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 (возможно, неправильно) интерпретирует это как сбой процесса и, следовательно, предполагает, что это должна быть ошибка компилятора. Но это не совсем так, проблема в том, что ОС убила 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 уже включен swap, набрав:
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" вы увидите пространство подкачки.
Это было ключом к моему сценарию (сборка мезо в CentOS 7) для экземпляра AWS EC2.
Я исправил это, увеличив память и процессор как минимум до 4 ГБ и 2 виртуальных ЦП.