NUMA

Capire l'architettura NUMA

Capire l'architettura NUMA
Progettare computer è sempre un compromesso. I quattro componenti di base di un computer - l'unità di elaborazione centrale (CPU) o processore, la memoria, l'archiviazione e la scheda per il collegamento dei componenti (sistema bus di I/O) - sono combinati nel modo più intelligente possibile per creare una macchina che è sia conveniente che potente. Il processo di progettazione prevede principalmente un'ottimizzazione verso processori (coprocessori, configurazione multi-core), tipo e quantità di memoria, archiviazione (dischi, file system) e prezzo.L'idea alla base dei coprocessori e dell'architettura multi-core è quella di distribuire le operazioni a quante più singole unità di calcolo nel minor spazio possibile e di rendere l'esecuzione parallela delle istruzioni di calcolo più disponibile e conveniente. In termini di memoria, è una questione di quantità o dimensione che può essere affrontata dalla singola unità di calcolo e quale tipo di memoria lavora 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, dal threading, dal protocollo di trasferimento, dal tessuto di comunicazione e dal numero di dispositivi di memoria collegati.

Il design dei bus di 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 sopra elencati. La prima categoria è guidata dai componenti utilizzati nel campo dell'High Performance Computing (HPC). A partire dalla metà del 2020, tra i rappresentanti contemporanei di HPC ci sono Nvidia Tesla e DGX, Radeon Instinct e gli acceleratori basati su GPU Intel Xeon Phi (vedi [1,2] per i confronti dei prodotti).

Capire NUMA

Non-Uniform Memory Access (NUMA) descrive un'architettura di memoria condivisa utilizzata nei sistemi multiprocessing contemporanei. NUMA è un sistema informatico composto da più nodi singoli in modo tale che la memoria aggregata sia condivisa tra tutti i nodi: “a ciascuna CPU è assegnata la propria memoria locale e può accedere alla memoria delle altre CPU del sistema” [12,7].

NUMA è un sistema intelligente utilizzato per collegare più unità di elaborazione centrale (CPU) a qualsiasi quantità di memoria 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 sta utilizzando in un particolare nodo NUMA. La memoria esterna o remota è la memoria che una CPU sta prendendo da un altro nodo NUMA. Il termine rapporto NUMA descrive il rapporto tra il costo di accesso alla memoria esterna e il costo di accesso alla memoria locale. Maggiore è il rapporto, maggiore è il costo, e quindi più tempo occorre per accedere alla memoria.

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

Guardando indietro: evoluzione dei multiprocessori a memoria condivisa

Frank Dennemann [8] afferma che le moderne architetture di sistema non consentono un vero Uniform Memory Access (UMA), anche se questi sistemi sono progettati specificamente per tale scopo. In parole povere, l'idea del calcolo parallelo era di avere un gruppo di processori che cooperassero per calcolare un dato compito, velocizzando così un calcolo sequenziale altrimenti classico.

Come spiegato da Frank Dennemann [8], all'inizio degli anni '70, "la necessità di sistemi in grado di servire più operazioni utente simultanee e un'eccessiva generazione di dati divenne mainstream" con l'introduzione di sistemi di database relazionali. “Nonostante l'impressionante tasso di prestazioni del monoprocessore, i sistemi multiprocessore erano meglio attrezzati per gestire questo carico di lavoro. Per fornire un sistema conveniente, lo spazio degli indirizzi di memoria condivisa è diventato il fulcro della ricerca. All'inizio, sono stati consigliati sistemi che utilizzano uno switch crossbar, tuttavia con questa complessità di progettazione scalata insieme all'aumento dei processori, che ha reso il sistema basato su bus più attraente. I processori in un sistema bus [possono] accedere all'intero spazio di memoria inviando richieste sul bus, un modo molto conveniente per utilizzare la memoria disponibile nel modo più ottimale possibile."

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

La maggior parte delle CPU è stata costruita su un piano bidimensionale. Le CPU dovevano anche avere controller di memoria integrati aggiunti. La semplice soluzione di avere quattro bus di memoria (in alto, in basso, a sinistra, a destra) per ciascun core della CPU ha consentito la piena larghezza di banda disponibile, ma questo va solo fino a un certo punto. Le CPU sono rimaste stagnanti con quattro core per un tempo considerevole. L'aggiunta di tracce sopra e sotto ha consentito bus diretti attraverso le CPU diagonalmente opposte man mano che i chip diventavano 3D. Posizionare una CPU a quattro core su una scheda, che poi è stata collegata a un bus, è stato il passo logico successivo.

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

Migliorare l'efficienza dell'accesso ai dati è uno degli obiettivi principali del design contemporaneo delle CPU. Ogni core della CPU era dotato di una piccola cache di livello uno (32 KB) e una più grande (256 KB) di livello 2 di cache. I vari core condividerebbero in seguito una cache di livello 3 di diversi MB, la cui dimensione è cresciuta notevolmente nel tempo.

Per evitare errori di cache - richiedendo dati che non sono nella cache - viene dedicato molto tempo alla ricerca per trovare il giusto numero di cache della CPU, strutture di memorizzazione nella cache e algoritmi corrispondenti. Vedere [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 progettazione alla base di NUMA.

Supporto software per NUMA

Esistono due misure di ottimizzazione del software che possono migliorare le prestazioni di un sistema che supporta l'architettura NUMA: affinità del processore e posizionamento dei dati. Come spiegato in [19], "l'affinità del processore [...] consente l'associazione e la separazione di un processo o di un thread a una singola CPU o a un intervallo di CPU in modo che il processo o il thread venga eseguito solo sulla CPU o sulle CPU designate piuttosto che di qualsiasi CPU.” Il termine “posizionamento dei dati” si riferisce a modifiche software in cui codice e dati vengono mantenuti il ​​più vicino possibile in memoria.

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

Nel libro "Computer Science and Technology, Proceedings of the International Conference (CST2016)" Ning Cai suggerisce che lo studio dell'architettura NUMA si è concentrato principalmente sull'ambiente informatico di fascia alta e ha proposto il Radix Partitioning (NaRP) compatibile con NUMA, che ottimizza le prestazioni delle cache condivise nei nodi NUMA per accelerare le applicazioni di business intelligence. In quanto tale, NUMA rappresenta una via di mezzo tra i sistemi di memoria condivisa (SMP) con pochi processori [6].

NUMA e Linux

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

# numactl --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
dimensione nodo 0: 8157 MB
nodo 0 libero: 88 MB
nodo 1 cpu: 8 9 10 11 12 13 14 15 24 25 26 27 28 29 30 31
dimensione nodo 1: 8191 MB
nodo 1 libero: 5176 MB
distanze dei nodi:
nodo 0 1
0: 10 20
1: 20 10

NumaTop è un utile strumento sviluppato da Intel per monitorare la località della memoria di runtime e analizzare i processi nei sistemi NUMA [10,11]. Lo strumento può identificare potenziali colli di bottiglia delle prestazioni relativi a NUMA e quindi aiutare a riequilibrare 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 indirizzamento lineare. Ciò porta a un uso più efficiente dello schema di indirizzamento a 64 bit, con conseguente spostamento più rapido dei dati, minore replica dei dati e programmazione più semplice.

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

Conclusione

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

Link e riferimenti

  1. Confronta NVIDIA Tesla vs. Radeon Instinct, https://www.itcentralstation.com/prodotti/confronti/nvidia-tesla_vs_radeon-instinct
  2. Confronta NVIDIA DGX-1 con. Radeon Instinct, https://www.itcentralstazione.com/prodotti/confronti/nvidia-dgx-1_vs_radeon-instinct
  3. Coerenza della cache, Wikipedia, https://en.wikipedia.org/wiki/Cache_coherence
  4. Spionaggio degli autobus, Wikipedia, https://en.wikipedia.org/wiki/Bus_snooping
  5. Protocolli di coerenza della cache nei sistemi multiprocessore, Geeks for geek, https://www.geeksforgeeks.org/cache-coherence-protocols-in-multiprocessor-system/
  6. Informatica e tecnologia - Atti della Conferenza Internazionale (CST2016), Ning Cai (EdE.), World Scientific Publishing Co Pte Ltd, ISBN: 9789813146419
  7. Daniele Pi. Bovet e Marco Cesati: Understanding NUMA architecture in Understanding the Linux Kernel, 3rd edition, O'Reilly, https://www.oreilly.com/library/view/understanding-the-linux/0596005652/
  8. Frank Dennemann: NUMA Deep Dive Parte 1: Da UMA a NUMA, https://frankdenneman.nl/2016/07/07/numa-deep-dive-part-1-uma-numa/
  9. Colin Ian King: NumaTop: uno strumento di monitoraggio del sistema NUMA, http://smackerelofopinion.blogspot.com/2015/09/numatop-numa-system-monitoring-tool.html
  10. Numatop, https://github.com/intel/numatop
  11. Pacchetto numatop per Debian GNU/Linux, https://packages.debian.org/buster/numatop
  12. Jonathan Kehayias: Understanding Non-Uniform Memory Access/Architectures (NUMA), https://www.sqlskills.com/blogs/jonathan/understanding-non-uniform-memory-accessarchitectures-numa/
  13. Novità sul kernel Linux 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-uniform_memory_access
  15. Documentazione sulla gestione della memoria Linux, NUMA, https://www.kernel.org/doc/html/latest/vm/numa.html
  16. Pacchetto numactl per Debian GNU/Linux, https://packages.debian.org/sid/admin/numactl
  17. Pacchetto numad per Debian GNU/Linux, https://packages.debian.org/buster/numad
  18. Come scoprire se la configurazione NUMA è abilitata o disabilitata?, https://www.thegeekdiary.com/centos-rhel-how-to-find-if-numa-configuration-is-enabled-or-disabled/
  19. Affinità processore, Wikipedia, https://en.wikipedia.org/wiki/Processor_affinity

Grazie

Gli autori desiderano ringraziare Gerold Rupprecht per il suo supporto durante la preparazione di questo articolo.

Riguardo agli Autori

Plaxedes Nehanda è una persona poliedrica e indipendente che indossa molti ruoli, tra cui un pianificatore di eventi, un assistente virtuale, un trascrittore e un avido ricercatore, con sede a Johannesburg, in Sudafrica.

Principe K. Nehanda è un ingegnere di strumentazione e controllo (metrologia) presso Paeflow Metering ad Harare, Zimbabwe.

Frank Hofmann lavora on the road - preferibilmente da Berlino (Germania), Ginevra (Svizzera) e Cape Town (Sud Africa) - come sviluppatore, formatore e autore per riviste come Linux-User e Linux Magazine. È anche il coautore del libro sulla gestione dei pacchetti Debian (http://www.dpmb.org).

Il cursore salta o si sposta in modo casuale durante la digitazione in Windows 10
Se scopri che il cursore del mouse salta o si sposta da solo, automaticamente, in modo casuale durante la digitazione nel laptop o nel computer Window...
Come invertire la direzione di scorrimento del mouse e dei touchpad in Windows 10
Topo e Touchpads non solo rende l'elaborazione semplice, ma anche più efficiente e richiede meno tempo. Non possiamo immaginare una vita senza questi ...
Come modificare il puntatore del mouse e le dimensioni, il colore e lo schema del cursore su Windows 10
Il puntatore del mouse e il cursore in Windows 10 sono aspetti molto importanti del sistema operativo. Questo si può dire anche per altri sistemi oper...