Perché le persone raccomandano l'opzione -j3 per make quando si ha una CPU dual-core?


18

In Gentoo Linux è possibile impostare la MAKEOPTSvariabile /etc/portage/make.confper dire makequanti lavori dovrebbe essere eseguito in parallelo durante la creazione di pacchetti. Dato che ho una CPU dual-core, ho ingenuamente scelto di usare l' -j2opzione: un lavoro per core, quindi entrambi hanno qualcosa da fare. Il "problema" è che ci sono molti riferimenti che dicono agli utenti che hanno una CPU dual-core di impostare l' -j3opzione. Alcuni di loro sono:

Ad esempio, il manuale di Gentoo dice:

Una buona scelta è il numero di CPU (o core della CPU) nel sistema più uno, ma questa linea guida non è sempre perfetta.

Ma qual è la logica della regola "CPU + 1"? Perché il lavoro extra?

La pagina man make.conf (5) dice anche:

Le impostazioni consigliate sono tra CPU + 1 e 2 * CPU + 1.

Ho anche letto la sezione 5.4 (Esecuzione parallela) nella makepagina delle informazioni e la makespiegazione della pagina man per l' -jopzione, ma sembra che non ci siano risposte lì.



Risposte:


13

Non esiste una regola semplice che funzioni sempre. Le persone potrebbero raccomandare una figura particolare perché hanno sperimentato una particolare compilazione su una macchina particolare e questa era l'impostazione migliore, o perché hanno seguito alcuni ragionamenti che potrebbero o meno avere qualche relazione con la realtà.

Se sei benedetto con molta RAM, il fattore limitante in una lunga compilazione sarà il tempo della CPU. Quindi un'attività per CPU, più un'attività in sospeso per quei blocchi I / O occasionali, è una buona impostazione. Questo lo rende -j3per una CPU dual-core (o più precisamente, per una macchina dual-CPU - se ogni core è hyperthreaded, sarebbero 4 CPU, quindi -j5).

Se hai pochissima RAM, un fattore limitante potrebbe essere che non puoi avere molti lavori simultanei, altrimenti continueranno a scambiarsi. Ad esempio, se non è possibile adattare comodamente due istanze del compilatore in memoria, make -j2potrebbe essere già più lento di make. Poiché ciò dipende da quanti processi del compilatore puoi inserire nella RAM contemporaneamente, non c'è modo di ricavare una cifra generale.

Nel mezzo, può essere utile avere più posti di lavoro. Se ogni processo del compilatore è piccolo, ma la build nel suo insieme tocca molti dati, allora l'I / O del disco potrebbe essere il fattore di blocco. In questo caso, avrai bisogno di più lavori per CPU contemporaneamente, in modo che ci sia sempre un lavoro che utilizza ciascuna CPU mentre altri sono in attesa di I / O. Ancora una volta, questo dipende molto dal lavoro di compilazione e dalla RAM disponibile, qui da ciò che è disponibile per la cache di dati (c'è un ottimale dopo il quale avere troppi lavori inquina troppo la cache).


Non sapevo che se i core della CPU fossero hyperthreaded, ognuno di essi conta come due. Ad ogni modo, sembra che la mia CPU non supporti Hyper Threading.
Francesco Turco,

Ho accettato questa risposta. Comunque ho scelto di attenermi -j2al mio sistema. Questo perché ho provato a emergere entrambi gcce firefoxcon impostazioni -j1fino a -j5(per un totale di 10 comandi emerge), e sembra che mentre -j2è decisamente più veloce di -j1, le altre tre impostazioni sono alla pari -j2.
Francesco Turco,

7

Immagino che questo sia un po ' euristico : consentire makel'avvio di CPUs + 1processi è assicurarsi che:

  1. non ci sarebbe un divario tra un processo di lavoro che è appena terminato e un lavoratore ancora da eseguire, un po 'come la coda di esecuzione pre-riempimento.
  2. non ci sarebbero troppi processi in competizione per portare un notevole sovraccarico con quel pre-riempimento della coda di esecuzione.

Ma, di nuovo, è euristico e il manuale di FreeBSD raccomanda ancora make -j4per una singola CPU.


5

In generale, ci sono ragioni per avviare più lavori rispetto al numero di core. Per la compilazione in C usando gcc, se -pipe non è definito nelle opzioni gcc, fa le sue azioni (preelaborazione, prima esecuzione, ottimizzazioni e assemblaggio) in sequenza usando file temporanei; -pipe cambia questo in usando pipe tra sottoprocessi. (L'aggiunta di -pipe è predefinita, ad esempio per FreeBSD ma non è tradizionale su Linux.) Quindi, se hai 2 core e consenti 2 lavori in parallelo, trascorreranno un po 'di tempo nell'I / O del disco. La raccomandazione di aggiungere 1 lavoro sembra essere correlata a queste specifiche. Ma per ottenere la risposta finale dovresti trovare chi e quando ha aggiunto questa raccomandazione e chiedergli :) o chiedere nella mailing list degli sviluppatori di Gentoo.


2

Fondamentalmente quel numero è ciò che gli autori chiamano buonsenso. Nel migliore dei casi, è una buona ipotesi. Per quanto ne so il processo di creazione che viene generato quando si digita makeè già conteggiato in modo da -j3poter finire con il processo principale in attesa, mentre gli altri due si stanno compilando.

Tuttavia, quando usavo Gentoo la regola pratica era <#cpus>*2 + 1.

Tutto dipende da ciò che i tuoi percorsi di pollo, foglie di tè o palla magica 8 ti dicono sull'I / O del disco che deve avvenire e sulla pianificazione del tuo attuale kernel Linux. [inizia il nucleo di questo post] Dalla mia esperienza personale ( -jnon è specifica di Gentoo), tutto tra #cpus + 1 e #cpus * 2 +1 produce risultati eccellenti [termina il nucleo di questo post] e in media difficilmente noterai alcuna differenza. Processori e kernel sono abbastanza buoni in questi giorni.

MA tutto ciò cambia quando: a) in realtà usi più di una casella per compilare (du'h) oppure b) stai sviluppando il tuo codice

Un -jattributo più elevato ha maggiori probabilità di mostrare dipendenze precedentemente sconosciute.

E da un lato nota: non andare dal numero di core, ma dal numero di flussi simultanei che prendono le CPU. (Hypertheading!)

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.