Linux și sistem multiprocesor simetric (cod sursă) - produse software

M. Tim Jones, inginer de consultanță, Emulex

Viteza sistemului Linux poate fi mărită în multe moduri, iar una dintre cele mai populare este creșterea performanței procesorului. Soluția evidentă este utilizarea unui procesor cu o viteză mai mare a ceasului, dar pentru orice tehnologie există o limitare fizică, când generatorul ceasului nu poate funcționa mai repede. Când atingeți această limită, puteți utiliza o abordare mult mai bună și puteți aplica mai multe procesoare. Din păcate, performanța are o dependență neliniară de setul de parametri ai procesoarelor individuale.







Înainte de a discuta despre utilizarea multiprocesării în Linux, să aruncăm o privire asupra istoriei sale.

Istoria multiprocesării

Clasificarea arhitecturilor multiprocesoare ale lui Flynn.

Un flux de instrucțiuni, un flux de date (SISD - instrucțiune unică, date unice) reprezintă o arhitectură tipică uniprocesor. Arhitectura multiprocesor Multe fluxuri de instrucțiuni, mai multe fluxuri de date (MIMD), conțin procesoare separate care funcționează pe date independente (paralelism de control). În sfârșit, un flux de instrucțiuni, multe fluxuri de date (SIMD - instrucțiuni unice, date multiple) au un număr de procesoare care funcționează cu diferite tipuri de date (paralelism de date).

Multiprocesarea sa născut la mijlocul anilor '50, într-o serie de companii, dintre care unele știți, iar altele au fost deja uitate (IBM, Digital Equipment Corporation, Control Data Corporation). La începutul anilor 1960, Burroughs Corporation a introdus un multiprocesor simetric de tip MIMD cu patru CPU-uri, cu până la șaisprezece module de memorie conectate printr-un conector de coordonate (prima arhitectură SMP). CDC 6600, cunoscut și de succes, a fost introdus în 1964 și a furnizat CPU-ul cu zece subprocesoare (procesoare periferice). La sfârșitul anilor 1960, Honeywell a lansat un alt sistem multiprocesor simetric de opt CPU Multics.

În timp ce sistemele multiprocesor au evoluat, tehnologiile au avansat, reducând dimensiunea procesoarelor și sporind capacitatea lor de a lucra la o viteză de ceas semnificativ mai mare. În anii 1980, companii precum Cray Research au introdus sisteme multiprocesor și sisteme de operare asemănătoare UNIX® care le-ar putea folosi (CX-OS).

La sfârșitul anilor 1980, cu popularitatea unor computere personale cu un singur procesor, cum ar fi PC-ul IBM, a existat o scădere a sistemelor multiprocesor. Dar acum, cu douăzeci de ani mai târziu, multiprocesarea a revenit la aceleași computere personale sub forma unei multiprocesări simetrice.

Gene Amdahl (Gene Amdahl), un arhitect calculator și IBM Fellow, a dezvoltat arhitecturi de calculatoare de la IBM, a creat compania omonim, Amdahl Corporation, și altele. Dar faima ia adus legea lui, care calculează îmbunătățirea maximă posibilă a sistemului îmbunătățind în același timp părțile sale. Legea este folosită în principal pentru a calcula îmbunătățirea teoretică maximă a performanței sistemului atunci când se utilizează mai multe procesoare (a se vedea figura 1).

Figura 1. Legea lui Amdahl pentru paralelizarea proceselor

Folosind ecuația prezentată în figura 1, puteți calcula îmbunătățirea maximă a performanțelor sistemului, folosind N procesoare și factorul F. care indică o parte a sistemului nu poate fi parallelized (sistem parțial consecvent în natură). Rezultatul este prezentat în figura 2.

Figura 2. Legea lui Amdahl pentru un sistem cu până la zece CPU-uri

Linia de sus din Figura 2 arată numărul de procesoare. În mod ideal, aceasta este ceea ce ați dori să vedeți după adăugarea unor procesoare suplimentare pentru a rezolva problema. Din păcate, datorită faptului că nu totul în sarcină poate fi paralel și există costuri neproductive în gestionarea procesoarelor, accelerarea este puțin mai mică. Mai jos (linia purpurie) este cazul unei probleme care este de 90% consecventă. Cel mai bun caz din această diagramă corespunde liniei maro, care reprezintă o sarcină care este de 10% consecventă și, respectiv, de 90% - paralelă. Chiar și în acest caz, zece procesoare nu funcționează mult mai bine decât cinci.

Multiprocesare și PC

Arhitectura SMP este una dintre cele unde două sau mai multe procesoare identice sunt conectate între ele prin intermediul unei memorii partajate. Toți aceștia au același acces la memoria partajată (în același timp de așteptare pentru accesul la spațiul de memorie). Opusul este arhitectura accesului neuniform al memoriei (NUMA - Memorie non-uniformă). De exemplu, fiecare procesor are memorie proprie și acces la memoria partajată cu o latență diferită.

Multiprocesare cuplată în mod liber

Sistemele SMP de la începutul anului au fost sisteme multiprocesoare cuplate în mod liber, adică construite din mai multe sisteme separate conectate printr-o conexiune de mare viteză (cum ar fi 10G Ethernet, Fibre Channel sau Infiniband). Un alt nume pentru acest tip de arhitectură - un cluster (a se vedea figura 3), care este o soluție populară pentru proiectul Linux Beowulf rămâne. Clusterele Beowulf de la Linux pot fi construite din hardware-ul disponibil și dintr-o conexiune de rețea convențională, cum ar fi Ethernet.







Figura 3. Arhitectură multiprocesor cuplată liber

Sistemele de construcție cu arhitectură multiprocesor cuplată în mod liber este simplă (datorită unor proiecte precum Beowulf), însă are limitări. Crearea unei rețele multiprocesoare mari poate necesita o capacitate și un spațiu considerabil. Un obstacol mai grav este materialul canalului de comunicare. Chiar și cu o rețea de mare viteză, cum ar fi 10G Ethernet, există o limită de scalabilitate pentru sistem.

Cuplaj multiplu puternic

Multiprocesarea cuplată puternic se referă la procesarea la nivelul cipului (CMP - multiprocesarea la nivel de chip). Imaginați-vă o arhitectură slab cuplată la nivelul unui cristal. Aceasta este ideea de multiprocesare cuplată strâns (numită și computing multi-core). Pe un microcircuit integrat mai multe cristale, memorie partajată și conexiune formează un nucleu bine integrat pentru multiprocesare (a se vedea figura 4).

Asamblare multiprocesare asimetrica (ASMP - multiprocesare asimetrica), noua CPU

Pentru a utiliza SMP cu Linux pe echipamente compatibile SMP, trebuie să configurați corect kernelul. Opțiunea CONFIG_SMP trebuie să fie activată în timpul configurației kernelului, astfel încât nucleul să știe despre SMP. Dacă un astfel de nucleu rulează pe o gazdă multiprocesor, puteți determina numărul de procesoare și tipul acestora folosind sistemul de fișiere proc.

Mai întâi obțineți numărul de procesoare din fișierul cpuinfo din / proc, folosind grep. După cum puteți vedea din listare 1, utilizați opțiunea de contra (-c) a șirurilor care încep cu procesorul de texte. Conținutul fișierului cpuinfo este, de asemenea, enumerat. De exemplu, placa de baza Xeon este preluata pe doua cristale.

Listing 1. Folosind sistemul de fișiere proc pentru a obține informații despre procesor

Când a fost introdus pentru prima dată Linux 2.0, suportul pentru SMP a constat într-un sistem de închidere de bază care a permis secvențializarea accesului în sistem. Mai târziu, s-au înregistrat puține progrese în ceea ce privește susținerea SMP, dar numai cu kernelul 2.6, puterea completă a SMP a apărut în cele din urmă.

Kernel 2.6 a introdus un nou planificator 0 (1) care include un suport mai bun pentru sistemele SMP. Cheia a fost capacitatea de a echilibra sarcina pe toate CPU-urile disponibile, pe cât posibil evitând procesele de comutare între procesoare pentru o utilizare mai eficientă a cache-ului. În ceea ce privește performanța cache-ului, amintiți-vă din Figura 4 că atunci când o sarcină interacționează cu un CPU, mutarea în altul necesită implicarea cache-ului. Aceasta crește timpul de așteptare pentru accesarea memoriei sarcinii, în timp ce datele sale se află în memoria cache a noului procesor.

SMP în miez
Pentru a înțelege modul în care SMP este inițializat pentru o anumită arhitectură, uitați-vă la fișierele smp.c sau smpboot.c din interiorul kernel-ului. / linux / arc // kernel / (pentru cele mai multe arhitecturi și platforme).

Kernelul 2.6 salvează o pereche de run-uri pentru fiecare procesor (expirat și rularea activă). Fiecare rachetă suportă 140 de priorități, dintre care 100 sunt utilizate pentru activități în timp real, iar restul de 40 pentru sarcini ale utilizatorilor. Sarcini li se acordă o durată de timp pentru execuție, iar atunci când își folosesc timpul, se mută de la rularea activă la cea expirată. În acest fel, procesorul este la fel de accesibil pentru toate sarcinile (blocând numai CPU-uri individuale).

Cu coada de sarcini pe fiecare CPU, munca poate fi echilibrată, oferind o încărcare ponderată a tuturor procesoarelor din sistem. La fiecare 200 de milisecunde, planificatorul efectuează echilibrarea încărcării pentru a redistribui sarcinile și pentru a menține echilibrul în complexul procesorului.

Fluxul spațiului utilizatorilor: dezvoltarea puterii SMP

În kernel-ul Linux, s-au făcut multe eforturi pentru a dezvolta SMP, dar sistemul de operare, în sine, nu este suficient. Amintiți-vă că puterea SMP constă în TLP. Programele individuale monolitice (cu un singur fir) nu pot utiliza SMP, dar SMP poate fi folosit în programe care constau din mai multe fire care pot fi împărțite între nuclee. În timp ce un fir este în așteptare pentru o operație I / O, cealaltă poate face ceva lucru util. Astfel, firele funcționează, suprapunându-se timpul de așteptare unul pentru celălalt.

Fluxurile de interfață ale sistemului de operare portabil (POSIX) reprezintă o modalitate excelentă de a construi aplicații cu filet care pot utiliza SMP. Fluxurile standardului POSIX oferă un mecanism de lucru cu firele, precum și memoria partajată. Când programul este activat, se creează un număr de fire, fiecare păstrând propriul său stack (variabile locale și stare), dar împărtășește spațiul de date al părintelui. Toate firele create au același spațiu de date, dar aici se află problema.

Pentru a sprijini accesul multi-threaded în memoria partajată, sunt necesare mecanisme de coordonare. POSIX oferă o funcție de excludere reciprocă pentru crearea de secțiuni critice. care permit accesul exclusiv la un obiect (locația de memorie) pentru un singur fir. Dacă acest lucru nu se face, memoria poate fi deteriorată datorită unor manipulări nesin- cronizate efectuate de mai multe fire. Lista 2 ilustrează crearea unei secțiuni critice cu ajutorul excluderii reciproce POSIX.

Listare 2. Folosind pthread_mutex_lock și deblocați pentru a crea secțiuni critice


Dacă mai multe fire încearcă să blocheze semaphore după apelul inițial în partea de sus, ele sunt blocate și solicitările lor sunt puse în coadă până la executarea apelului pthread_mutex_unlock.

Protecția variabilei kernel pentru SMP

Atunci când mai multe nuclee din procesor funcționează în paralel pentru kernelul OS, este de dorit să evitați partajarea datelor care sunt specifice acestui nucleu de procesor. Din acest motiv, kernelul 2.6 a introdus conceptul de variabile pentru fiecare kernel asociat cu procesoare individuale. Aceasta vă permite să declarați variabilele pentru CPU, cele mai des folosite de acest CPU, care minimizează cerințele de blocare și îmbunătățește execuția.

Definiția variabilelor unui kernel individual se face utilizând macro DEFINE_PER_CPU. la care treceți tipul și numele variabilei. Deoarece macro-ul vine ca o valoare l, aici îl puteți inițializa. Următorul exemplu (din ./arch/i386/kernel/smpboot.c) definește o variabilă care reprezintă starea pentru fiecare CPU din sistem.


Macro-ul creează o serie de variabile, una pentru fiecare instanță a procesorului. Pentru a obține variabila unui CPU separat, macro-ul per_cpu este utilizat împreună cu funcția smp_processor_id. care returnează ID-ul curent al CPU pentru care rulează în prezent programul.


Kernelul oferă alte funcții pentru blocarea fiecărui procesor și alocarea dinamică a variabilelor. Aceste funcții pot fi găsite în ./include/linux/percpu.h.

Când frecvența procesorului atinge limita, mai multe procesoare sunt de obicei adăugate pentru a crește performanța. Anterior, aceasta a însemnat adăugarea mai multor procesoare pe placa de bază sau gruparea mai multor computere independente într-un cluster. Astăzi, multiprocesarea la nivelul cristalului oferă mai mult procesoare pe un singur cip, oferind performanțe și mai rapide, reducând timpul de așteptare pentru memorie.

Sistemele SMP veți găsi nu numai pe servere, ci și pe desktop-uri, mai ales cu introducerea virtualizării. La fel ca multe tehnologii avansate, Linux oferă suport SMP. Kernel-ul are rolul de a optimiza sarcina procesoarelor disponibile (de la fire la sisteme de operare virtualizate). Tot ce rămâne rămâne să vă asigurați că aplicația poate fi suficient de împărțită în fire pentru a utiliza puterea SMP.







Articole similare

Trimiteți-le prietenilor: