Comprensione dell'architettura NUMA

Comprensione dell'architettura NUMA
Progettare i computer è sempre un compromesso. I quattro componenti di base di un computer - l'unità di elaborazione centrale (CPU) o il processore, la memoria, la memoria e la scheda per la connessione dei componenti (sistema Bus I/O) - sono combinati il ​​più abilmente possibile per creare una macchina che è sia economico che potente. Il processo di progettazione prevede principalmente un'ottimizzazione verso i processori (co-processori, configurazione multi-core), tipo di memoria e importo, archiviazione (dischi, file system), nonché prezzo.L'idea alla base dei coprocessori e dell'architettura multi-core è quella di distribuire operazioni a quante più singole unità di elaborazione nello spazio più piccolo possibile e rendere l'esecuzione parallela delle istruzioni di elaborazione più disponibili e convenienti. In termini di memoria, si tratta della quantità o della dimensione che può essere affrontata dalla singola unità di elaborazione e quale tipo di memoria funziona con la latenza più bassa possibile. L'archiviazione appartiene alla memoria esterna e le sue prestazioni dipendono dal tipo di disco, dal file system in uso, threading, protocollo di trasferimento, tessuto di comunicazione e numero di dispositivi di memoria allegati.

La progettazione di bus I/O rappresenta le arterie del computer e determina in modo significativo quanto e quanto velocemente i dati possono essere scambiati tra i singoli componenti elencati sopra elencati. La categoria principale è guidata dai componenti utilizzati nel campo di alte computing (HPC). A partire dalla metà del 2020, tra i rappresentanti contemporanei di HPC ci sono Nvidia Tesla e DGX, Radeon Instinct e prodotti acceleratori basati su GPU Intel Xeon Phi (vedi [1,2] per i confronti dei prodotti).

Comprensione di NUMA

L'accesso alla memoria non uniforme (NUMA) descrive un'architettura di memoria condivisa utilizzata nei sistemi multiprocessing contemporanei. NUMA è un sistema di calcolo composto da diversi singoli nodi in modo tale che la memoria aggregata sia condivisa tra tutti i nodi: "A ogni CPU viene assegnata la propria memoria locale e può accedere alla memoria da altre CPU nel sistema" [12,7].

NUMA è un sistema intelligente utilizzato per il collegamento di più unità di elaborazione centrali (CPU) a qualsiasi quantità di memoria del computer disponibile sul computer. I singoli nodi NUMA sono collegati su una rete scalabile (bus I/O) in modo tale che una CPU possa accedere sistematicamente alla memoria associata ad altri nodi NUMA.

La memoria locale è la memoria che la CPU utilizza in un particolare nodo NUMA. La memoria estera o remota è la memoria che una CPU sta prendendo da un altro nodo NUMA. Il termine rapporto NUMA descrive il rapporto tra il costo dell'accesso alla memoria estera e il costo dell'accesso alla memoria locale. Maggiore è il rapporto, maggiore è il costo e quindi più tempo impiega per accedere alla memoria.

Tuttavia, ci vuole più tempo di quando quella CPU sta accedendo alla propria memoria locale. L'accesso alla memoria locale è un grande vantaggio, in quanto combina bassa latenza con elevata larghezza di banda. Al contrario, l'accesso alla memoria appartenente a qualsiasi altra CPU ha una latenza più elevata e prestazioni di larghezza di banda inferiori.

Guardando indietro: evoluzione dei multiprocessori di memoria condivisa

Frank Dennemann [8] afferma che le moderne architetture di sistema non consentono l'accesso alla memoria veramente uniforme (UMA), anche se questi sistemi sono specificamente progettati a tale scopo. Semplicemente parlando, l'idea del calcolo parallelo era quella di avere un gruppo di processori che cooperano per calcolare un determinato compito, accelerando così un calcolo sequenziale altrimenti classico.

Come spiegato da Frank Dennemann [8], nei primi anni '70, "la necessità di sistemi che potessero servire più operazioni di utenti simultanei e la generazione di dati eccessiva è diventata mainstream" con l'introduzione di sistemi di database relazionali. “Nonostante l'impressionante tasso di prestazioni uniprocessore, i sistemi multiprocessore erano meglio equipaggiati per gestire questo carico di lavoro. Per fornire un sistema economico, lo spazio degli indirizzi di memoria condivisa è diventato al centro della ricerca. All'inizio, sono stati sostenuti sistemi che utilizzano un interruttore a traversa, tuttavia con questa complessità di progettazione in scala insieme all'aumento dei processori, il che ha reso il sistema basato su autobus più attraente. I processori in un sistema bus [possono] accedere all'intero spazio di memoria inviando richieste sul bus, un modo molto economico per utilizzare la memoria disponibile nel modo più ottimale possibile."

Tuttavia, i sistemi informatici basati su autobus sono dotati di un collo di bottiglia - la quantità limitata di larghezza di banda che porta a problemi di scalabilità. Più CPU vengono aggiunte al sistema, minore larghezza di banda per nodo disponibile. Inoltre, più CPU vengono aggiunti, più a lungo è il bus e maggiore è la latenza di conseguenza.

La maggior parte delle CPU sono state costruite su un piano bidimensionale. Le CPU dovevano anche avere i controller di memoria integrati aggiunti. La semplice soluzione di avere quattro bus di memoria (in alto, in basso, a sinistra, a destra) a ciascun core della CPU consentiva la larghezza di banda disponibile completa, ma questo va solo finora. Le CPU stagnano con quattro core per un tempo considerevole. L'aggiunta di tracce sopra e sotto consentiva gli autobus diretti attraverso le CPU contrastate in diagonale quando i chip sono diventati 3D. Posizionare una CPU a quattro codi su una carta, che poi collegata a un bus, è stato il prossimo passo logico.

Oggi, ogni processore contiene molti core con una cache su chip condivisa e una memoria off-chip e ha costi di accesso alla memoria variabile in diverse parti della memoria all'interno di un server.

Migliorare l'efficienza dell'accesso ai dati è uno dei principali obiettivi della progettazione della CPU contemporanea. Ogni core della CPU è stato dotato di una cache di livello uno piccolo (32 kb) e una cache di livello 2 più grande (256 kb). I vari core avrebbero successivamente condiviso una cache di livello 3 di diversi MB, la cui dimensione è cresciuta considerevolmente nel tempo.

Per evitare i manchi della cache - richiedere dati che non si trovano nella cache - viene impiegato un sacco di tempo di ricerca per trovare il giusto numero di cache della CPU, strutture di memorizzazione nella cache e algoritmi corrispondenti. Vedi [8] per una spiegazione più dettagliata del protocollo per la memorizzazione nella cache di snoop [4] e la coerenza della cache [3,5], nonché le idee di design dietro NUMA.

Supporto software per NUMA

Esistono due misure di ottimizzazione del software che possono migliorare le prestazioni di un sistema a supporto dell'architettura NUMA: affinità e posizionamento dei dati. Come spiegato in [19], “Affinità del processore […] consente l'associazione e l'indennità di un processo o un thread a una singola CPU, o una gamma di CPU in modo che il processo o il thread eseguiranno piuttosto solo sulla CPU designata o le CPU di qualsiasi CPU."Il termine" posizionamento dei dati "si riferisce alle modifiche del software in cui il codice e i dati sono mantenuti il ​​più vicino possibile nella memoria.

I diversi sistemi operativi UNIX e UNIX supportano NUMA nei modi seguenti (l'elenco seguente è tratto da [14]):

  • Silicon Graphics Irix Supporto per l'architettura CCNUMA su 1240 CPU con Server Origin Server.
  • Microsoft Windows 7 e Windows Server 2008 R2 Aggiunto supporto per l'architettura NUMA su 64 core logici.
  • Versione 2.5 del kernel Linux conteneva già il supporto NUMA di base, che è stato ulteriormente migliorato nelle successive versioni del kernel. Versione 3.8 del kernel Linux ha portato una nuova fondazione NUMA che ha consentito lo sviluppo di politiche NUMA più efficienti nelle successive rilasci di kernel [13]. Versione 3.13 del kernel Linux ha portato numerose politiche che mirano a mettere un processo vicino alla sua memoria, insieme alla gestione dei casi, come avere pagine di memoria condivisa tra i processi o l'uso di pagine enormi trasparenti; Le nuove impostazioni di controllo del sistema consentono di abilitare o disabilitare il bilanciamento NUMA, nonché la configurazione di vari parametri di bilanciamento della memoria NUMA [15].
  • Sia Oracle che OpenSolaris Model NUMA Architecture con l'introduzione di gruppi logici.
  • FreeBSD ha aggiunto l'affinità NUMA iniziale e la configurazione dei criteri nella versione 11.0.

Nel libro "Informatica e tecnologia, Atti della Conferenza internazionale (CST2016)" Ning CAI suggerisce che lo studio dell'architettura NUMA si è concentrato principalmente sull'ambiente di calcolo di fascia alta e ha proposto il partizionamento RADIX NUMA-AWARE (NARP), che ottimizza Le prestazioni delle cache condivise nei nodi NUMA per accelerare le applicazioni di business intelligence. Pertanto, NUMA rappresenta una via di mezzo tra i sistemi di memoria condivisa (SMP) con alcuni processori [6].

NUMA e Linux

Come indicato sopra, il kernel Linux ha supportato NUMA dalla versione 2.5. Sia Debian GNU/Linux che Ubuntu offrono supporto NUMA per l'ottimizzazione del processo con i due pacchetti software NUMACTL [16] e NUMAD [17]. Con l'aiuto del comando NUMACTL, è possibile elencare l'inventario dei nodi NUMA disponibili nel sistema [18]:

# NUMACTL -H -HARDWARE
Disponibile: 2 nodi (0-1)
Nodo 0 CPU: 0 1 2 3 4 5 6 7 16 17 18 19 20 21 22 23
Nodo 0 Dimensioni: 8157 MB
nodo 0 gratuito: 88 MB
Nodo 1 CPU: 8 9 10 11 12 13 14 15 24 25 26 27 28 29 30 31
Nodo 1 Dimensione: 8191 MB
nodo 1 gratuito: 5176 MB
distanze di nodo:
nodo 0 1
0: 10 20
1: 20 10

Nimatop è uno strumento utile sviluppato da Intel per il monitoraggio della località di memoria di runtime e dell'analisi dei processi nei sistemi NUMA [10,11]. Lo strumento può identificare potenziali colli di bottiglia per le prestazioni relativi a NUMA e quindi aiutare a riattivare le allocazioni di memoria/CPU per massimizzare il potenziale di un sistema NUMA. Vedere [9] per una descrizione più dettagliata.

Scenari di utilizzo

I computer che supportano la tecnologia NUMA consentono a tutte le CPU di accedere direttamente all'intera memoria: le CPU vedono questo come un unico spazio di indirizzi lineari. Ciò porta a un uso più efficiente dello schema di indirizzamento a 64 bit, con conseguente movimento più rapido dei dati, meno replica dei dati e una programmazione più semplice.

I sistemi NUMA sono piuttosto interessanti per le applicazioni sul lato server, come i sistemi di data mining e supporto decisionale. Inoltre, la scrittura di applicazioni per i giochi di gioco e ad alte prestazioni diventa molto più semplice con questa architettura.

Conclusione

In conclusione, l'architettura NUMA affronta la scalabilità, che è uno dei suoi vantaggi principali. In una CPU NUMA, un nodo avrà una larghezza di banda superiore o una latenza inferiore per accedere alla memoria su quello stesso nodo (E.G., La CPU locale richiede l'accesso alla memoria contemporaneamente all'accesso remoto; La priorità è sulla CPU locale). Ciò migliorerà drasticamente la trasmissione della memoria se i dati sono localizzati in processi specifici (e quindi processori). Gli svantaggi sono i costi più elevati di spostamento dei dati da un processore a un altro. Finché questo caso non si verifica troppo spesso, un sistema NUMA supererà i sistemi con un'architettura più tradizionale.

Collegamenti e riferimenti

  1. Confronta Nvidia Tesla vs. Radeon Instinct, https: // www.ItcentralStation.com/prodotti/confronti/nvidia-tesla_vs_radeon-istinct
  2. Confronta Nvidia DGX-1 vs. Radeon Instinct, https: // www.ItcentralStation.com/prodotti/confronti/nvidia-dgx-1_vs_radeon-istinct
  3. Cache Coherence, Wikipedia, https: // en.Wikipedia.org/wiki/cache_coherence
  4. Bus Snooping, Wikipedia, https: // en.Wikipedia.org/wiki/bus_snooping
  5. Protocolli di coerenza della cache in sistemi multiprocessore, geek per geek, https: // www.geeksforgeeks.org/cache-coherence-protocols-in-multiprocessor-system/
  6. Informatica e tecnologia - Atti della Conferenza internazionale (CST2016), NING CAI (ed.), World Scientific Publishing Co Pte Ltd, ISBN: 9789813146419
  7. Daniel p. Bovet e Marco Cesati: comprensione dell'architettura NUMA nella comprensione del kernel Linux, 3a edizione, O'Reilly, https: // www.Oreilly.com/libreria/view/comprensione-the-linux/0596005652/
  8. Frank Dennemann: NUMA Deep Dive Part 1: da Uma a Nima, https: // Frankdenneman.NL/2016/07/07/NUMA-DEEP-DIVE-Part-1-Uma-Numa/
  9. Colin Ian King: Nimatop: uno strumento di monitoraggio del sistema NUMA, http: // smackerelofopinion.Blogspot.com/2015/09/numerat-numa-system-monitors-tool.html
  10. NUMATOP, https: // github.com/Intel/Nimatop
  11. Pacchetto numOtop per Debian GNU/Linux, https: // pacchetti.Debian.Org/Buster/Nimatop
  12. Jonathan Kehayias: comprensione dell'accesso/architettura della memoria non uniforme (NUMA), https: // www.sqlskills.com/blogs/jonathan/comprensione-non-non-uniform-memory-accessarchitectures-numa/
  13. Linux Kernel News per il kernel 3.8, https: // kernelnewbies.org/linux_3.8
  14. Accesso alla memoria non uniforme (NUMA), Wikipedia, https: // en.Wikipedia.Org/wiki/non uniforme_memory_access
  15. Documentazione di gestione della memoria Linux, NUMA, https: // www.kernel.org/doc/html/v4.18/VM/NUMA.html
  16. Pacchetto numactl per debian gnu/linux, https: // pacchetti.Debian.org/sid/admin/numactl
  17. Pacchetto numad per debian gnu/linux, https: // pacchetti.Debian.Org/Buster/Nimad
  18. Come trovare se la configurazione NUMA è abilitata o disabilitata?, https: // www.TheGeekdiary.com/centos-rhel-how-to-find-if-numa-configuration-is-abilita-o-disabili
  19. Affinità del processore, Wikipedia, https: // en.Wikipedia.org/wiki/processor_affinity

Grazie

Gli autori desiderano ringraziare Gerold Rupprecht per il suo supporto mentre preparano questo articolo.

Riguardo agli Autori

Plaxedes Nehanda è una persona versatile multiskillata e autonoma che indossa molti cappelli, tra questi, un pianificatore di eventi, un assistente virtuale, un trascrittore e un appassionato ricercatore, con sede a Johannesburg, in Sudafrica.

Prince k. Nehanda è un ingegnere di strumentazione e controllo (metrologia) presso la misurazione di Paeflow a Harare, Zimbabwe.

Frank Hofmann lavora sulla strada - preferibilmente da Berlino (Germania), Ginevra (Svizzera) e Cape Town (Sudafrica) - come sviluppatore, allenatore e autore per riviste come Linux -User e Linux Magazine. È anche coautore del libro di gestione dei pacchetti Debian (http: // www.dpmb.org).