Czy `make -j` (bez argumentów) jest niebezpieczne? [Zamknięte]

13

Wcześniej dzisiaj, kiedy coś budowałem, postanowiłem uruchomić makejako

$ make -j

być może z przyzwyczajenia z innych programów, takich jak cabalgdzie -jdomyślnie rozsądnych granicach.

Około 20 sekund później cały mój pulpit się zatrzymuje . Szukam różnych oznak aktywności. Brak fanów. Lampka dysku twardego świeci na zielono, ale nie słyszę żadnej aktywności dysku. Hmmmmm. Po 10 minutach ciszy w końcu widzę odpowiedź na pierwsze naciśnięcie klawisza, które zrobiłem przed wiekami, a także zaczynam słyszeć zbyt znajomy dźwięk uderzania dysku. 20 minut później, po powolnej próbie wkroczenia do terminalu na tej niereagującej maszynie, ułożyłem się i użyłem REISUB.


Na początku pomyślałem, że winowajcą musiała być niezwiązana z aplikacją komputerowa aplikacja, ponieważ już dawno nałożyłem limity pamięci na interaktywne sesje bash, aby uniemożliwić mi postawienie się w takiej sytuacji! Ale /var/log/syslogopowiada inną historię; zabójca OOM pozostawił niektórych psskładowisk , które są podejrzanie pakowanych z c++i cc1plusprocesów!

Oto analiza częstotliwości jednego z tych zrzutów:

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

Sprawdzam więc stronę podręcznika GNU make: (wyróżnienie dodane)

-j [zadania], --jobs [= zadania] Określa liczbę zadań (poleceń) do uruchomienia jednocześnie. Jeśli jest więcej niż jedna opcja -j, ostatnia jest skuteczna. Jeśli podano opcję -j bez argumentu, make nie ograniczy liczby zadań, które mogą być uruchomione jednocześnie.


Jestem niechętny, aby zobaczyć, czy mogę odtworzyć problem (doktorze, boli kiedy robię to ...) , ale wyniki badań do tej pory wydaje się być home run: Oczywiście, make -ji setki wyniku procesów musi mieć było przyczyną zawieszenia i bicia dysku. To powiedziawszy, przeszukując internet, nie mogę znaleźć wiele ostrzeżeń przed tym. Czy dochodzę do wniosków?

Czy make -jwydaje mi się to tak niebezpieczne? Jeśli tak, to dlaczego, u licha , tam jest i co można zrobić, aby to zrobić idioto?

Exp HP
źródło
Uwaga: W ostatnim pytaniu rozważam dodanie argumentu, alias make="make -j4"aby wyeliminować potrzebę dodawania -jNargumentów, ale nadal nie zastanawiałem się nad wszystkimi możliwymi konsekwencjami ...
Exp HP
1
Aby uzyskać globalne limity, skorzystaj makez własnych udogodnień i zrób to export MAKEFLAGS="-j 4". Dla dalszych dochodzeń I poradę czytania przed typowania . PS: <liczba rdzeni> + 2 służy mi dobrze od prawie dwóch dekad. Wcześniej Linus zrobił finał, make -j128zanim wypuścił jądro.
Bananguin,

Odpowiedzi:

6

Istnieją narzędzia, które pozwalają strzelać sobie w stopy na wiele pomysłowych sposobów. Ma to na celu wykorzystanie wyobraźni do rozwiązywania problemów bez ograniczania się tym, co ktoś inny uważa za „zdrowe”.

Uruchomienie make -jmałego projektu jest całkowicie rozsądne. W innych projektach używanie -jbez argumentów poważnie osłabia czas reakcji systemu. W niektórych projektach użycie kompilacji równoległych, nawet z -j2, całkowicie ją przerwie (pliki utworzone przez równoległy proces tworzenia nie są dostępne na czas itp.).

Osobiście unikałbym aliasu makedo make -j4(jak mówisz, rozważasz, w komentarzach). Uważam, że lepiej jest wyraźnie powiedzieć maszynie, co ma robić, aby wiedzieć, co zrobi. Za kilka dni zapomnę o tym aliasie i zastanawiam się, dlaczego cztery projekty, które buduję w oddzielnych terminalach, powodują, że mój system przestaje odpowiadać.

Jeśli chodzi o „niebezpieczne” ... to słowo oznacza różne rzeczy w różnych kontekstach. Tak, jest to „niebezpieczne”, ponieważ może powodować brak reakcji systemu. Tak, jest to „niebezpieczne”, ponieważ może spowodować awarię procesu kompilacji w połowie kompilacji. Ale nie, nie jest to „niebezpieczne” w tym sensie, że sformatuje dysk twardy lub rozpocznie usuwanie losowych plików.

Jak więc to zrobić, idioto-dowód?

Oto szczegółowy przewodnik krok po kroku:

  1. Naucz się korzystać z narzędzi.

Zauważ także, że -jflaga na BSD make nie wymaga argumentu, i że ta flaga jest niestandardowa (średnia Unix POSIX nie wspomnieć o tym).

Kusalananda
źródło
4

Możesz także ograniczyć make przy użyciu -l:

-l [ładuj], --load-średnia [= ładuj] Określa, że ​​nie należy uruchamiać nowych zadań (poleceń), jeśli są uruchomione inne zadania, a średnia wartość obciążenia wynosi co najmniej obciążenie (liczba zmiennoprzecinkowa). Bez argumentu usuwa poprzedni limit obciążenia.

Ale uwaga, że nie wydaje się, aby pomóc uruchomić go tak: make -j -l4.

Zbyt wiele zadań jest uruchamianych, zanim średnia wartość obciążenia przekroczy limit (na podstawie mojego doświadczenia). Tak więc kombinacja może działać, np make -j8 -l4.

Zitrax
źródło