Является ли `make -j` (без аргументов) опасным?

Раньше сегодня, когда я строил что-то, я решил запустить make as

 $ make -j 

возможно, по привычке с другими программами, такими как cabal где -j умолчанию имеет разумный предел.

Примерно через 20 секунд весь мой рабочий стол останавливается . Я ищу различные признаки деятельности. Нет вентиляторов. Свет на жестком диске зеленый, но я не слышу активности диска. Hmmmmm. После 10 минут молчания я наконец вижу ответ на первое нажатие клавиши, которое я создал много веков назад, и я также начинаю слышать слишком знакомый звук измельчения диска. Спустя 20 минут, медленно пытаясь пробраться в терминал на этой машине без ответа, я сбежал и использовал REISUB.


Во-первых, я решил, что не связанное настольное приложение должно быть преступником, потому что у меня давно были ограничения на память на интерактивных сессиях bash, чтобы помешать мне вступить в такую ​​ситуацию! Но /var/log/syslog рассказывает другую историю; убийца OOM оставил после себя несколько отвалов ps которые подозрительно упакованы с процессами c++ и cc1plus !

Вот частотный анализ одного из этих дампов:

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

Поэтому я проверяю man-страницу для GNU make: (выделено курсивом)

-j [jobs], –jobs [= jobs] Определяет количество заданий (команд) для запуска одновременно. Если имеется более одной опции -j, последняя эффективна. Если параметр -j задан без аргумента, make не будет ограничивать количество заданий, которые могут выполняться одновременно.


Я не хочу видеть, могу ли я воспроизвести проблему (Доктор, мне больно, когда я это делаю …) , но результаты исследования пока кажутся домашним бегом: Очевидно, make -j и сотни результатов процессы должны были быть причиной зависания и обрушения диска. Тем не менее, в Интернете, я не могу найти много предупреждений против него. Собираюсь ли я к выводам?

Является ли make -j опасным, как мне кажется? Если да, то почему это так, и что можно сделать, чтобы идиотизировать это?

  • Настройте OOM, чтобы избежать остановки системы
  • Вне свопа - Что происходит?
  • OOM Killer продолжает убивать mysqld
  • Ошибка «grep: memory outed» на большом разделе
  • Что происходит, когда объем tmpfs заполнен и swap заполнен? Включен ли OOM-убийца Linux?
  • Перезагрузите систему, если она исчерпана?
  • Почему OOM-killer иногда не может убить ресурсных свиней?
  • Отладка вне памяти с помощью / var / log / messages
  • 2 Solutions collect form web for “Является ли `make -j` (без аргументов) опасным?”

    Есть инструменты, которые позволяют вам стрелять себе в ногу многими воображаемыми способами. Это так, что вы можете использовать свое воображение для решения проблем, не ограничиваясь тем, что кто-то считает «разумным».

    Запуск make -j в небольшом проекте вполне разумен. В других проектах использование -j без аргумента серьезно повредит реакции системы (попробуйте с помощью nice -n 20 может быть?). В некоторых проектах использование параллельных построений, даже с -j2 , полностью разрушит сборку (файлы, созданные параллельным процессом make, отсутствуют вовремя и т. Д.).

    Я бы лично избегал наложения псевдонимов, чтобы make -j4 . Я считаю, что лучше явно указать машине, что делать, чтобы я знал, что она будет делать. Через несколько дней я забуду об этом псевдониме и задаюсь вопросом, почему четыре проекта, которые я строю на отдельных терминалах, делают мою систему невосприимчивой.

    Что касается «опасных» … Слово означает разные вещи в разных контекстах. Да, это «опасно», потому что это может сделать систему невосприимчивой. Да, это «опасно», потому что это может привести к сбою процесса сборки на полпути через сборку. Но нет, это не «опасно» в том смысле, что он переформатирует ваш жесткий диск или начнет удалять случайные файлы.

    Итак, как идиот-доказательство?

    Вот верный шаг за шагом:

    1. Научитесь использовать свои инструменты.

    Также обратите внимание, что флаг -j для BSD make требует аргумента и что этот флаг нестандартен (стандарт Unix POSIX не упоминает об этом).

    Вы также можете ограничить использование с помощью -l :

    -l [load], –load-average [= load] Указывает, что никакие новые задания (команды) не должны запускаться, если выполняются другие задания, а средняя нагрузка равна, по меньшей мере, нагрузке (число с плавающей запятой). Без аргумента удаляет предыдущий предел нагрузки.

    Но обратите внимание, что это не помогает запустить его следующим образом: make -j -l4 .

    Слишком много заданий запускается до того, как средний уровень нагрузки превысит лимит (основанный на моем опыте). Таким образом, комбинация может работать, например make -j8 -l4 .

    Interesting Posts
    Linux и Unix - лучшая ОС в мире.