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?
alias make="make -j4"
aby wyeliminować potrzebę dodawania-jN
argumentów, ale nadal nie zastanawiałem się nad wszystkimi możliwymi konsekwencjami ...