GNU/Linux >> Linux Esercitazione >  >> Linux

Cosa potrebbe causare il blocco di make durante la compilazione su più core?

Non ho una risposta a questo problema preciso, ma posso provare a darti un indizio di ciò che potrebbe accadere:dipendenze mancanti nei Makefile.

Esempio:

target: a.bytecode b.bytecode
    link a.bytecode b.bytecode -o target

a.bytecode: a.source
    compile a.source -o a.bytecode

b.bytecode: b.source
    compile b.source a.bytecode -o a.bytecode

Se chiami make target tutto verrà compilato correttamente. Compilazione di a.source viene eseguito (arbitrariamente, ma deterministicamente) per primo. Quindi la compilazione di b.source viene eseguita.

Ma se make -j2 target entrambi compile i comandi verranno eseguiti in parallelo. E noterai effettivamente che le dipendenze del tuo Makefile sono interrotte. La seconda compilazione presuppone a.bytecode è già compilato, ma non appare nelle dipendenze. Quindi è probabile che si verifichi un errore. La linea di dipendenza corretta per b.bytecode dovrebbe essere:

b.bytecode: b.source a.bytecode

Per tornare al tuo problema, se non sei fortunato è possibile che un comando si blocchi in un ciclo della CPU al 100%, a causa di una dipendenza mancante. Questo è probabilmente ciò che sta accadendo qui, la dipendenza mancante non può essere rivelata da una build sequenziale, ma è stata rivelata dalla tua build parallela.


Non so da quanto tempo hai la macchina, ma la mia prima raccomandazione sarebbe quella di provare un test della memoria e verificare che la memoria funzioni correttamente. So che spesso non è la memoria il problema, ma se lo è, è meglio eliminarla come causa prima di provare a rintracciare altri probabili problemi.


Mi rendo conto che questa è una domanda molto vecchia, ma appare ancora in cima ai risultati di ricerca, quindi ecco la mia soluzione:

GNU make ha un meccanismo di jobserver per garantire che make e i suoi figli ricorsivi non consumino più del numero specificato di core:http://make.mad-scientist.net/papers/jobserver-implementation/

Si basa su una pipe condivisa da tutti i processi. Ogni processo che desidera eseguire il fork di altri figli deve prima consumare i token dalla pipe, quindi abbandonarli al termine. Se un processo figlio non restituisce i token che ha consumato, il make while di livello superiore si blocca per sempre in attesa che vengano restituiti.

https://bugzilla.redhat.com/show_bug.cgi?id=654822

Ho riscontrato questo errore durante la creazione di binutils con GNU make sulla mia macchina Solaris, dove "sed" non è GNU sed. Giocherellare con PATH per fare in modo che sed==gsed abbia la priorità sul sistema sed ha risolto il problema. Non so perché sed stesse consumando token dalla pipe, però.


Linux
  1. Cosa uso su Linux per rendere eseguibile un programma Python

  2. Qual è il modo corretto per chiudere la mia applicazione PyQt quando viene uccisa dalla console (Ctrl-C)?

  3. Cosa succede quando un thread si biforca?

  4. Cosa sta causando tutte queste dichiarare -x ... linee quando apro un terminale?

  5. Qual è la scheda più semplice compatibile con Linux che potrei realizzare a casa?

Cosa succede esattamente quando eseguo un file nella shell?

Linux:cosa fa "make Localmodconfig"?

Linux:cosa fare quando un desktop Linux si blocca?

Quindi cosa sono i core CPU logici (in opposizione ai core CPU fisici)?

DahliaOS è uno sguardo a ciò che potrebbe diventare Fuschia di Google

Cosa può impedire a Linux di rispondere per minuti durante la navigazione in determinati siti Web?