Чи небезпечно `make -j` (без аргументів)? [зачинено]


13

Раніше сьогодні, будуючи щось, я вирішив бігти makeяк

$ make -j

може бути , за звичкою з іншими програмами , такими , як , cabalде по -jзамовчуванням в розумних межах.

Приблизно через 20 секунд весь мій робочий стіл перемелюється . Я шукаю різні ознаки активності. Вболівальники не обертаються. Індикатор жорсткого диска суцільно зелений, але я не чую жодної активності диска. Гммммм. Після 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: (наголос додано)

-j [jobs], --jobs [= jobs] Вказує кількість завдань (команд) для виконання одночасно. Якщо є кілька варіантів -j, останній діє. Якщо параметр -j заданий без аргументу, make не обмежує кількість завдань, які можуть працювати одночасно.


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

Настільки make -jнебезпечний, як мені здавалося? Якщо так, то чому на землі він є, і що можна зробити, щоб ідіотом це було?


Примітка. В останньому запитанні я розглядаю питання про те, alias make="make -j4"щоб усунути необхідність додавання -jNаргументів, але я все ще не продумав усі можливі наслідки ...
Exp HP

1
Для глобальних обмежень будь ласка, використовуйте makeвласні засоби та робіть export MAKEFLAGS="-j 4". Для подальших досліджень я раджу прочитати, перш ніж набрати текст . PS: <кількість ядер> + 2 служить мені добре вже майже два десятиліття. Ще в той час Лінус зробив фінал, make -j128перш ніж випустити ядро.
Bananguin

Відповіді:


6

Є інструменти, які дозволяють стріляти себе в ногу багатьма образними способами. Це так, що ви можете використовувати свою фантазію для вирішення проблем, не обмежуючись тим, що хтось інший вважає "здоровим".

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

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

Щодо "небезпечних" ... Слово означає різні речі в різних контекстах. Так, це "небезпечно", оскільки може змусити систему не реагувати. Так, це "небезпечно", оскільки це може призвести до краху процесу збирання на півдорозі. Але ні, це не "небезпечно" в тому сенсі, що він переформатує ваш жорсткий диск або почне видаляти випадкові файли.

Отже, як це ідіот-доказ?

Ось надійний покроковий посібник:

  1. Навчіться користуватися своїми інструментами.

Зверніть також увагу, що -jпрапор BSD make це вимагає аргументу, і що цей прапор не є стандартним (стандарт Unix POSIX не згадує).


4

Ви також можете обмежити створення, використовуючи -l:

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

Але зверніть увагу , що це не схоже на допомогу , щоб запустити його , як це: make -j -l4.

Занадто багато завдань запускається до того, як середнє навантаження підвищиться за ліміт (на основі мого досвіду). Таким чином, комбінація може працювати, наприклад make -j8 -l4.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.