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

13

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

$ make -j

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

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


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

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

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

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

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


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

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

Опыт HP
источник
Примечание. По последнему вопросу я рассматриваю вопрос о добавлении аргумента, alias make="make -j4"чтобы исключить необходимость добавления -jNаргументов, но я все еще не продумал все возможные последствия ...
Опыт HP
1
Для глобальных ограничений, пожалуйста, используйте makeсобственные средства и делайте export MAKEFLAGS="-j 4". Для дальнейших расследований I советов чтения , прежде чем печатать . PS: <количество ядер> + 2 хорошо служило мне вот уже почти два десятилетия. В свое время Линус сделал финал make -j128перед выпуском ядра.
Bananguin

Ответы:

6

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

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

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

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

Итак, как это защитить от идиота?

Вот верное пошаговое руководство:

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

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

Кусалананда
источник
4

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

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

Но обратите внимание , что это не похоже на помощь , чтобы запустить его , как это: make -j -l4.

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

Zitrax
источник