Prima di oggi, quando costruivo qualcosa, ho deciso di correre make
come
$ make -j
forse per abitudine con altri programmi come quelli in cabal
cui il -j
valore 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/syslog
racconta una storia diversa; il killer OOM lasciato alcune ps
discariche che sono sospettoso confezionati con c++
e cc1plus
processi!
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 -j
e 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 -j
pericoloso come mi sembrerebbe? Se è così, perché mai è lì, e cosa si può fare per dimostrarlo?
make
le 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 -j128
passato , Linus ha fatto una finale prima di rilasciare un kernel.
alias make="make -j4"
per eliminare la necessità di aggiungere-jN
argomenti, ma non ho ancora riflettuto su tutte le possibili conseguenze ...