Ранее сегодня, когда что-то строил, я решил запустить 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
так опасно, как мне кажется? Если так, то почему он там, и что можно сделать, чтобы защитить его от идиотов?
источник
alias make="make -j4"
чтобы исключить необходимость добавления-jN
аргументов, но я все еще не продумал все возможные последствия ...make
собственные средства и делайтеexport MAKEFLAGS="-j 4"
. Для дальнейших расследований I советов чтения , прежде чем печатать . PS: <количество ядер> + 2 хорошо служило мне вот уже почти два десятилетия. В свое время Линус сделал финалmake -j128
перед выпуском ядра.Ответы:
Есть инструменты, которые позволяют вам стрелять себе в ногу многими образными способами. Это сделано для того, чтобы вы могли использовать свое воображение для решения проблем, не ограничиваясь тем, что кто-то считает «вменяемым».
Работать
make -j
над небольшим проектом вполне разумно. В других проектах использование-j
без аргументов серьезно подорвет отзывчивость системы. В некоторых проектах использование параллельных сборок, даже если-j2
они полностью нарушают сборку (файлы, созданные процессом параллельного создания, не успевают за другим и т. Д.)Я бы лично избежать наложения
make
наmake -j4
(как вы говорите , что вы рассматриваете, в комментариях). Я считаю, что лучше явно сказать машине, что делать, чтобы я знал, что она будет делать. Через несколько дней я забуду об этом псевдониме и удивлюсь, почему четыре проекта, которые я строю в отдельных терминалах, делают мою систему не отвечающей на запросы.Что касается «опасного» ... Слово означает разные вещи в разных контекстах. Да, это «опасно», потому что это может сделать систему безразличной. Да, это «опасно», потому что может привести к сбою процесса сборки на полпути во время сборки. Но нет, это не «опасно» в том смысле, что оно переформатирует ваш жесткий диск или начнет удалять случайные файлы.
Итак, как это защитить от идиота?
Вот верное пошаговое руководство:
Обратите также внимание, что
-j
флаг BSDmake
это требует аргумента, и что этот флаг не является стандартным (стандарт Unix POSIX не упоминает).источник
Вы также можете ограничить использование make
-l
:Но обратите внимание , что это не похоже на помощь , чтобы запустить его , как это:
make -j -l4
.Слишком много заданий запускается до того, как средняя нагрузка превысит лимит (исходя из моего опыта). Таким образом, комбинация может работать, например
make -j8 -l4
.источник