De ce recomandă oamenii opțiunea -j3 pentru make atunci când au un procesor dual-core? (Unix, Gentoo, Face)

user22304 a intrebat.

În Gentoo Linux este posibil să setați opțiunea MAKEOPTS în /etc/portage/make.conf pentru a spune make câte joburi ar trebui să ruleze în paralel atunci când se construiesc pachete. Deoarece am un procesor cu două nuclee, am ales în mod naiv să utilizez variabila -j2 opțiunea: un job pe fiecare nucleu, astfel încât ambele să aibă ceva de făcut. „Problema” este că există o mulțime de referințe care le spun utilizatorilor care au un CPU dual-core să seteze opțiunea -j3 opțiunea în schimb. Câteva dintre ele sunt::

De exemplu, în manualul Gentoo se spune:

O alegere bună este numărul de unități centrale de procesare (sau nuclee de procesare) din sistemul dvs. plus unu, dar această indicație nu este întotdeauna perfectă.

Dar care este rațiunea pentru regula „CPU + 1”? De ce această sarcină suplimentară?

În pagina de manual make.conf(5) se spune chiar așa:

Setările sugerate sunt între CPUs+1 și 2*CPU+1.

De asemenea, am citit secțiunea 5.4 (Execuție paralelă) din pagina make pagina de informații și make explicația din pagina de manual pentru -j opțiune, dar se pare că nu există răspunsuri acolo.

Comentarii

4 răspunsuri
Gilles ‘SO- nu mai fi rău’

Nu există o regulă simplă care să funcționeze întotdeauna. Oamenii pot recomanda o anumită cifră pentru că au experimentat cu o anumită compilație pe o anumită mașină și aceasta a fost cea mai bună setare, sau pentru că au urmat un raționament care poate avea sau nu o anumită legătură cu realitatea.

Dacă sunteți binecuvântat cu o mulțime de memorie RAM, atunci factorul limitativ într-o compilare lungă va fi timpul de procesare. Atunci, o singură sarcină pe CPU, plus o sarcină în așteptare pentru acele blocuri de I/O ocazionale, este o setare bună. Acest lucru face ca -j3 pentru un CPU cu două nuclee (sau, mai exact, pentru o mașină cu două CPU – dacă fiecare nucleu este hiperthreadat, ar fi vorba de 4 CPU-uri, deci -j5).

Dacă aveți foarte puțină memorie RAM, atunci un factor limitativ ar putea fi faptul că nu puteți avea multe lucrări concurente, altfel acestea vor continua să se facă reciproc swap out. De exemplu, dacă nu vă puteți potrivi confortabil două instanțe de compilare în memorie, make -j2 poate fi deja mai lent decât make. Deoarece acest lucru depinde de numărul de procese de compilare pe care le puteți include simultan în memoria RAM, nu există nicio modalitate de a obține o cifră generală.

Între cele două, poate fi benefic să aveți mai multe lucrări. Dacă fiecare proces de compilare este mic, dar compilarea în ansamblu atinge o mulțime de date, atunci I/O pe disc poate fi factorul de blocare. În acest caz, veți dori să aveți mai multe lucrări pe CPU în același timp, astfel încât să existe întotdeauna o lucrare care să folosească fiecare CPU în timp ce celelalte așteaptă I/O. Din nou, acest lucru depinde foarte mult de sarcina de construcție și de memoria RAM disponibilă, aici de ceea ce este disponibil pentru memoria cache de date (există un optim după care a avea prea multe sarcini poluează prea mult memoria cache).

Comentarii

  • Nu știam că, dacă nucleele CPU sunt hyperthreaded, atunci fiecare dintre ele contează ca două. Oricum, se pare că CPU-ul meu nu suportă Hyper Threading. – user22304
  • Am acceptat acest răspuns. Oricum, am ales să rămân cu -j2 pe sistemul meu. Asta pentru că am încercat să ies în evidență atât gcc și firefox cu setările de la -j1 până la -j5 (pentru un total de 10 comenzi emerge), și se pare că în timp ce -j2 este cu siguranță mai rapid decât -j1, , celelalte trei setări sunt la fel de rapide ca -j2. – user22304
poige

Cred că asta este un fel de euristic – permițând make să lanseze CPUs + 1 procese este de a se asigura că:

  1. nu va exista un decalaj între un proces lucrător care tocmai s-a terminat și un lucrător care urmează să fie executat – un fel de preumplere a cozii de execuție.
  2. nu vor exista prea multe procese concurente care să aducă un supraîncărcare notabilă cu această preumplere a cozii de execuție.

Dar, din nou, aceasta este euristică iar manualul FreeBSD este încă recomandă make -j4 pentru un singur procesor.

Netch

În general, există motive pentru a porni mai multe lucrări decât numărul de nuclee. Pentru compilarea C folosind gcc, dacă -pipe nu este definit în opțiunile gcc, acesta își face acțiunile (preprocesare, prima execuție, optimizări și asamblare) în succesiune, folosind fișiere temporare; -pipe schimbă acest lucru în folosirea de pipe-uri între subprocese. (Adăugarea -pipe este implicită, de exemplu, pentru FreeBSD, dar nu este tradițională pe Linux.) Astfel, dacă aveți 2 nuclee și permiteți 2 lucrări în paralel, acestea vor petrece ceva timp în I/O pe disc. Recomandarea de a adăuga 1 lucrare pare să aibă legătură cu acest specific.Dar pentru a obține un răspuns final ar trebui să găsiți cine și când a adăugat această recomandare și să-l întrebați:) sau să întrebați în lista de discuții Gentoo devels’.

Bananguin

Practic, acel număr este ceea ce autorii numesc bun simț. În cel mai bun caz, este o presupunere bună. Din câte știu eu, procesul make care este generat atunci când se tastează make este deja numărat, astfel încât cu -j3 puteți ajunge să aveți procesul principal în așteptare, în timp ce celelalte două procese sunt în curs de compilare.

Cu toate acestea, pe vremea când foloseam Gentoo, regula de bază era următoarea <#cpus>*2 + 1.

Totul depinde de ceea ce vă spun pistele de pui, frunzele de ceai sau mingea magică 8 despre E/S pe disc care trebuie să aibă loc și de programarea nucleului Linux actual. [începe miezul acestui post] Din experiența mea personală (-j nu este specifică lui Gentoo), tot ceea ce este cuprins între #cpus + 1 și #cpus *2 +1 dă rezultate bune [end this post’s core] și, în medie, nu veți observa aproape deloc diferențe. Procesoarele și nucleele sunt destul de bune în zilele noastre.

DAR toate acestea se schimbă atunci când:a) folosești efectiv mai mult de o cutie pentru a compila (du’h) orb) îți dezvolți propriul cod

O mai mare -j atribut este mai probabil să arate dependențe necunoscute anterior.

Și ca o notă secundară: nu te ghida după numărul de nuclee, ci după numărul de fluxuri concurente pe care le iau procesoarele. (Hypertheading!)

Tags:,