Wcześniej dzisiaj, kiedy coś budowałem, postanowiłem uruchomić make
jako
$ make -j
być może z przyzwyczajenia z innych programów, takich jak cabal
gdzie -j
domyś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/syslog
opowiada inną historię; zabójca OOM pozostawił niektórych ps
składowisk , które są podejrzanie pakowanych z c++
i cc1plus
procesó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 -j
i 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 -j
wydaje mi się to tak niebezpieczne? Jeśli tak, to dlaczego, u licha , tam jest i co można zrobić, aby to zrobić idioto?
źródło
alias make="make -j4"
aby wyeliminować potrzebę dodawania-jN
argumentów, ale nadal nie zastanawiałem się nad wszystkimi możliwymi konsekwencjami ...make
z własnych udogodnień i zrób toexport 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 -j128
zanim wypuścił jądro.Odpowiedzi:
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 -j
małego projektu jest całkowicie rozsądne. W innych projektach używanie-j
bez 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
make
domake -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:
Zauważ także, że
-j
flaga na BSDmake
nie wymaga argumentu, i że ta flaga jest niestandardowa (średnia Unix POSIX nie wspomnieć o tym).źródło
Możesz także ograniczyć make przy użyciu
-l
: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
.źródło