`Make -j` (senza argomenti) è pericoloso? [chiuso]


13

Prima di oggi, quando costruivo qualcosa, ho deciso di correre makecome

$ make -j

forse per abitudine con altri programmi come quelli in cabalcui il -jvalore predefinito è un limite ragionevole.

Circa 20 secondi dopo, il mio intero desktop si blocca . Cerco vari segni di attività. Nessun fan si accende. La luce dell'HDD è di colore verde fisso, ma non sento attività sul disco. Hmmmmm. Dopo 10 minuti di silenzio, finalmente vedo una risposta al primo keypress che ho fatto anni fa, e comincio anche a sentire il suono fin troppo familiare del thrashing del disco. 20 minuti dopo, cercando lentamente di entrare in un terminale su questa macchina che non rispondeva, ho ceduto e usato REISUB.


All'inizio, ho pensato che un'applicazione desktop non correlata dovesse essere stata la causa, perché da tempo avevo limiti di memoria posti su sessioni interattive di bash per impedirmi di affrontare esattamente questo tipo di situazione! Ma /var/log/syslogracconta una storia diversa; il killer OOM lasciato alcune psdiscariche che sono sospettoso confezionati con c++e cc1plusprocessi!

Ecco un'analisi di frequenza di uno di quei dump:

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

Quindi controllo la pagina man di GNU make: (enfasi aggiunta)

-j [jobs], --jobs [= jobs] Specifica il numero di lavori (comandi) da eseguire contemporaneamente. Se esiste più di un'opzione -j, l'ultima è efficace. Se l'opzione -j viene fornita senza un argomento, make non limiterà il numero di lavori che possono essere eseguiti contemporaneamente.


Sono riluttante a vedere se riesco a riprodurre il problema (Dottore, mi fa male quando faccio questo ...) , ma i risultati di indagini finora sembrano essere un home run: Chiaramente, make -je le centinaia di processi risultanti devo avere è stata la causa del blocco e del blocco del disco. Detto questo, cercando su Internet, non riesco a trovare molti avvertimenti contro di esso. Sto saltando alle conclusioni?

È make -jpericoloso come mi sembrerebbe? Se è così, perché mai è lì, e cosa si può fare per dimostrarlo?


Nota: sull'ultima domanda, sto pensando di aggiungere un alias make="make -j4"per eliminare la necessità di aggiungere -jNargomenti, ma non ho ancora riflettuto su tutte le possibili conseguenze ...
Exp HP

1
Per limiti globali, si prega di utilizzare makele proprie strutture e farlo export MAKEFLAGS="-j 4". Per ulteriori indagini io consiglio la lettura prima di battitura . PS: <numero di core> + 2 mi ha servito bene per quasi due decenni. In make -j128passato , Linus ha fatto una finale prima di rilasciare un kernel.
Bananguin,

Risposte:


6

Esistono strumenti che ti consentono di spararti al piede in molti modi fantasiosi. Questo è così che puoi usare la tua immaginazione per risolvere i problemi senza essere limitato da ciò che qualcun altro ritiene "sano".

L'esecuzione make -jsu un piccolo progetto è perfettamente ragionevole. In altri progetti, l'utilizzo -jsenza argomentazioni comprometterà seriamente la capacità di risposta del sistema. In alcuni progetti, l'utilizzo di build parallele, anche con -j2, interromperà completamente la build (i file creati da un processo di creazione parallela non sono in tempo per un altro, ecc.).

Io personalmente evitare l'aliasing makea make -j4(come dici tu stanno prendendo in considerazione, nei commenti). Trovo che sia meglio dire esplicitamente alla macchina cosa fare, in modo che io sappia cosa farà. Tra pochi giorni, mi sarò dimenticato di questo alias e mi chiederò perché i quattro progetti che sto realizzando in terminali separati non rispondano al mio sistema.

Per quanto riguarda "pericoloso" ... La parola significa cose diverse in contesti diversi. Sì, è "pericoloso" perché potrebbe non rispondere al sistema. Sì, è "pericoloso" perché potrebbe causare un arresto anomalo del processo di compilazione a metà della compilazione. Ma no, non è "pericoloso", nel senso che riformatterà il tuo disco rigido o inizierà a cancellare file casuali.

Quindi, come farlo a prova di idiota?

Ecco una guida dettagliata infallibile:

  1. Impara a usare i tuoi strumenti.

Si noti, inoltre, che la -jbandiera per BSD make non richiede un argomento, e che questa bandiera è non standard (lo standard POSIX Unix non ne parla).


4

Puoi anche limitare make usando -l:

-l [load], --load-average [= load] Specifica che non è necessario avviare nuovi lavori (comandi) se sono in esecuzione altri lavori e la media del carico è almeno load (un numero in virgola mobile). Senza alcun argomento, rimuove un limite di carico precedente.

Ma nota che non sembra aiutare a correre in questo modo: make -j -l4.

Troppi lavori vengono avviati prima che la media del carico superi il limite (in base alla mia esperienza). Quindi una combinazione può funzionare, ad es make -j8 -l4.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.