...

Architettura NUMA: perché svolge un ruolo importante nei server moderni

Il sito Architettura NUMA determina la velocità con cui i server moderni forniscono memoria ai thread e la capacità dei carichi di lavoro di scalare in caso di carico elevato. Mostrerò perché gli accessi alla memoria locale dominano la latenza e la larghezza di banda, come gli hypervisor utilizzano NUMA e quali impostazioni nelle VM consentono di ottenere miglioramenti diretti delle prestazioni.

Punti centrali

Riassumo brevemente i risultati più importanti ed evidenzio i fattori che hanno il maggiore impatto nei centri di calcolo.

  • Memoria locale Riduce al minimo la latenza e aumenta la velocità di trasmissione
  • Nodo NUMA Strutturano in modo efficiente CPU e RAM
  • Dimensione vCPU Adattare la dimensione del nodo per ogni VM
  • NUMA virtuale inviare al sistema operativo ospite
  • Regole di spanning per grandi esigenze di RAM

Mi concentro costantemente su Latenza e vicinanza dei dati, perché è proprio lì che si decide la potenza del server. Socket grandi, molti core e molta RAM servono a poco se i thread attendono costantemente aree di memoria remote. Dimensioni le VM in modo che si adattino a un nodo NUMA e l'allocazione della memoria rimanga locale. Supporto le funzionalità dell'hypervisor in modo mirato, invece di attivare tutto globalmente. In questo modo garantisco Scala senza sorprese nei picchi di carico.

Cosa rende davvero speciale NUMA

Penso in Nodo: Ogni nodo NUMA combina core CPU e un'area RAM locale con percorsi di accesso molto brevi. Se un thread trova i dati nella cache L1, L2 o L3, tutto funziona in modo estremamente veloce; se il set di dati si trova nella RAM locale, la latenza rimane bassa. Tuttavia, se il thread accede a un altro nodo, il tempo di attesa aumenta e il throughput diminuisce. Sono proprio queste differenze a rendere Non uniforme Accesso alla memoria. Pertanto, organizzo i carichi di lavoro in modo tale che la maggior parte degli accessi rimanga locale.

Perché l'UMA raggiunge i propri limiti

UMA condivide un comune percorso di archiviazione il che, con l'aumentare del numero di core, genera congestione. Ogni core aggiuntivo si inserisce nelle stesse code e compete per la larghezza di banda. In molte configurazioni precedenti, la latenza si accumulava fino a quando l'utilizzo della CPU era elevato, ma l'applicazione rispondeva in modo lento. Si ha la sensazione che la CPU sia al limite, anche se in realtà il collo di bottiglia è nell'accesso alla memoria. NUMA risolve proprio questo problema. Blocco tramite percorsi locali e topologia dei nodi.

NUMA vs. UMA: panoramica delle differenze

Mi piace riassumere le differenze più importanti in una sintesi compatta. Tabella fisso, in modo che le decisioni possano essere prese più rapidamente. Questa panoramica mostra ciò che è importante in termini di architettura, latenza e scalabilità. Mi aiuta a dimensionare i nuovi host e a individuare gli errori negli ambienti produttivi. Chi vede chiaramente la differenza tra accesso locale e remoto, prende decisioni migliori in termini di personalizzazione delle VM e allocazione della RAM. È proprio qui che si decide il Prestazioni sotto carico.

Criterio NUMA UMA Effetto pratico
accesso alla memoria Locale o remoto Standardizzato Gli accessi locali sono più veloci; quelli remoti comportano una latenza
Scala Ottimo con i nodi Limitato in anticipo Più core scalano in modo più affidabile con NUMA
Topologia Più nodi Pool unico Necessità di una progettazione attenta alla topologia
hypervisor Virtual NUMA disponibile Meno rilevante Il sistema operativo ospite può pianificare in modo NUMA-aware
messa a punto vCPU/RAM per nodo Ottimizzazione globale Le VM adeguate ai nodi garantiscono stabilità

NUMA in ambienti virtuali

Lascio che sia l'hypervisor a gestire la Topologia trasmettere al sistema operativo ospite, in modo che lo scheduler e la gestione della memoria possano pianificare localmente. Virtual NUMA mostra all'ospite i limiti dei suoi nodi, consentendo a database, JVM e worker .NET di organizzare i propri heap e thread in modo più efficiente. In questo modo evito costosi accessi remoti e mantengo stabile la latenza. In configurazioni sensibili, combino questo approccio con una strategia di pinning coerente e un'allocazione fissa della RAM. Per tempi di risposta estremamente brevi, utilizzo anche Hosting a micro-latenza per ridurre ulteriormente il jitter.

Best practice per le dimensioni delle VM e l'allocazione della CPU

Io dimensiono vCPU in modo che una VM si adatti a un nodo NUMA o lo sfiori appena. Esempio: se un host ha due nodi da 20 core ciascuno, pianifico le VM con 4-16 vCPU preferibilmente all'interno di un nodo. Chi va oltre rischia accessi remoti e tempi di attesa inutili. Distribuisco la RAM nel modo più statico possibile, in modo che il sistema operativo ospite mantenga le sue pagine a livello locale. Per i carichi di lavoro con una forte componente single-thread, includo la giusta strategia di core e utilizzo analisi come Single-thread vs. multi-core.

Vantaggi concreti per l'hardware di hosting

Con una progettazione NUMA accurata, aumento la densità per host, senza sacrificare i tempi di risposta. In molti data center è così possibile gestire un numero notevolmente maggiore di VM per socket, garantendo al contempo la reattività delle applicazioni. La latenza ridotta influisce direttamente sull'esperienza utente e sul throughput batch. I costi per carico di lavoro diminuiscono grazie a un utilizzo più efficiente del tempo di CPU e della RAM. Chi sceglie l'hardware in modo oculato beneficia inoltre dei vantaggi offerti dalla moderna Hardware per web hosting ad alte prestazioni con elevata larghezza di banda di memoria.

Ottimizzazione del carico di lavoro: database, cache, container

Mi assicuro che Banche dati mantengono i propri heap a livello locale ed eseguono i thread di lavoro sul „proprio“ nodo. Per i motori SQL, le cache in memoria e le JVM è utile un'assegnazione fissa delle CPU e una prenotazione della memoria. L'orchestrazione dei container beneficia delle affinità dei nodi, in modo che i pod utilizzino i percorsi di memoria più brevi. In caso di I/O intenso, mi affido ad assegnazioni NVMe vicine a NUMA per mantenere i dati vicini ai nodi. In questo modo gli hotpath rimangono brevi e il Tempo di risposta gentile.

Monitoraggio e risoluzione dei problemi con NUMA

Misuro Latenza e gli accessi remoti in modo mirato, invece di guardare solo alla percentuale di CPU. Gli strumenti mi mostrano per ogni nodo quante pagine sono remote e quali thread generano pressione sulla memoria. Se gli errori remoti aumentano, adeguo la dimensione della vCPU, le affinità o l'allocazione della RAM. Se il throughput rimane basso nonostante le elevate riserve di CPU, spesso la causa è da ricercarsi nei percorsi di memoria. La visibilità a livello di nodo è per me il modo più veloce per Cause, non solo ai sintomi.

NUMA Spanning: utilizzo corretto

Attivo Spanning Specifico per VM con requisiti di RAM molto elevati o larghezza di banda eccezionale. La VM può quindi ottenere memoria da più nodi, il che rende possibili le singole istanze con un footprint massiccio. Il prezzo da pagare è un accesso remoto occasionale, che attenuo con affinità CPU e una maggiore percentuale di page locality. In caso di carichi misti, preferisco scegliere più VM di medie dimensioni piuttosto che un'istanza molto grande. In questo modo Pianificabilità nella vita quotidiana.

Licenze, densità e costi reali

Tasso Costi non a livello di host, ma per carico di lavoro e mese in euro. Quando NUMA aumenta la densità delle VM, i costi fissi per istanza diminuiscono e le riserve di potenza aumentano. Ciò influisce sulle licenze per core, sui costi di assistenza e sui costi energetici. Riducendo gli accessi remoti, si riduce il tempo di elaborazione e si risparmia energia a parità di attività. Alla fine ciò che conta è il Bilancio complessivo in euro per risultato, non solo in euro per server.

Leggere correttamente la topologia hardware e le interconnessioni

Mi riferisco alla fisica Topologia attivamente nella mia pianificazione. I server moderni utilizzano design CPU multiparte e collegano chiplet o die tramite interconnessioni. Ciò significa che non tutti i core hanno lo stesso percorso verso ogni modulo RAM e che anche all'interno di un socket esistono percorsi preferenziali. Maggiore è il traffico che passa attraverso i collegamenti tra socket, maggiore è l'aumento Latenza e il sovraccarico di coerenza. Verifico quindi quanti canali di memoria sono attivi per ogni nodo, se tutti gli slot DIMM sono equipaggiati in modo simmetrico e come sono collegati i nodi nella scheda madre. Le funzionalità Sub-NUMA, che dividono i nodi in domini più piccoli, possono eliminare gli hotspot se i carichi di lavoro sono chiaramente segmentati. Osservo inoltre la Topologia L3: Se i thread e i loro dati si trovano in domini cache diversi, il solo trasferimento della cache comporta un notevole calo delle prestazioni. Un semplice test della larghezza di banda e una panoramica della topologia mostrano rapidamente se la piattaforma fornisce la località prevista o se le interconnessioni diventano un collo di bottiglia.

Opzioni firmware e BIOS con effetto

Nel BIOS mi assicuro che Interleaving dei nodi è disattivato, in modo che la struttura NUMA rimanga visibile. Utilizzo il clustering sub-NUMA o modalità simili in modo mirato quando i carichi di lavoro presentano molti volumi di lavoro di medie dimensioni e chiaramente separati. Per ottenere latenze costanti, scelgo profili energetici orientati alle prestazioni e riduco i livelli più profondi. Stati C ed evita il core parking aggressivo. Ottimizzo la configurazione della memoria per ottenere il massimo Larghezza di banda del canale di memoria; le configurazioni DIMM asimmetriche incidono direttamente sulla velocità di trasmissione e sui tempi di attesa. Controllo anche le opzioni Prefetcher e RAS: alcuni meccanismi di protezione aumentano la latenza senza servire al carico di lavoro. Importante: ogni modifica del BIOS viene testata con un carico reale, poiché gli effetti micro causati da cache e interconnessioni spesso si manifestano solo sotto pressione.

Sistema operativo guest e ottimizzazione runtime: dal primo tocco alle pagine enormi

Come ospite utilizzo Primo tocco-Allocazione a mio vantaggio: i thread inizializzano la „loro“ memoria in modo che le pagine vengano create localmente. Su Linux, attivo o disattivo il bilanciamento NUMA automatico in base al carico di lavoro; i sistemi vicini al database spesso traggono vantaggio da un collegamento stabile, mentre i web worker distribuiti sopportano migrazioni minime. Con numactl o task pinning collego i servizi ai nodi e definisco membind-Linee guida. Pagine enormi Riduco la pressione TLB; per i database critici in termini di latenza, preferisco pagine statiche di grandi dimensioni e memoria calda (pre-touch) per evitare picchi di errori di pagina. A seconda del motore, utilizzo pagine trasparenti di grandi dimensioni su „madvise“ o le disattivo se generano latenze di deframmentazione. Controllo Affinità IRQ e distribuisco gli interrupt di rete e NVMe sui nodi appropriati; RPS/XPS e code multiple aiutano a mantenere coerenti i percorsi dei dati. In Windows utilizzo gruppi di processori e Soft-NUMA nello stack, garantisco il „blocco delle pagine in memoria“ per i servizi che richiedono molta memoria e attivo il GC del server in .NET. Per le JVM utilizzo euristiche NUMA-consapevoli, heap pre-touche e controllo l'affinità dei thread in modo che GC e worker utilizzino gli stessi nodi.

Allineare correttamente le impostazioni specifiche dell'hypervisor

Passo la Topologia vNUMA alla struttura fisica. Seleziono i parametri „Socket“, „Core per socket“ e „Thread per core“ in modo tale che l'hypervisor non suddivida la VM tra i nodi. Per le istanze sensibili alla latenza, riservo la RAM in modo che non si verifichino né ballooning né swapping e assicuro le risorse pCPU tramite affinità o opzioni di scheduler adeguate. Attenzione con CPU o Memory Hot Add: molte piattaforme disattivano vNUMA nell'ospite, con conseguenti accessi remoti nascosti. Pianifico la migrazione live in modo che gli host di destinazione abbiano una topologia NUMA compatibile e, dopo la migrazione, concedo alle VM il tempo necessario per Località della pagina ricostruire (pre-touch, riscaldamento). Negli ambienti KVM utilizzo le opzioni di ottimizzazione NUMA e cpuset-Cgroups; in altri hypervisor, strumenti come exstop aiutano a visualizzare in tempo reale la distribuzione delle vCPU e i nodi colpiti.

Non sprecare la località PCIe e I/O

Organizzo NVMe-Unità, HBA e NIC al nodo su cui vengono eseguiti i thread di calcolo. Collego le code SR-IOV o vNIC ai core dello stesso nodo e controllo gli interrupt di conseguenza. Per velocità di pacchetti elevate, ridimensiono le code di ricezione/trasmissione e le distribuisco in modo coerente sui core locali. Per gli stack di archiviazione, mi assicuro che i thread di lavoro per gli invii e i completamenti I/O funzionino sullo stesso nodo, in modo che il percorso dei dati non attraversi l'interconnessione. Pianifico anche il multipathing e il RAID software in modo specifico per ogni nodo; un percorso „più breve“ batte quasi sempre il percorso „più ampio“ con accessi esterni. In questo modo riduco il jitter e porto sotto carico I/O il tempo di CPU dove ha effetto.

Pianificazione della capacità, overcommit e funzionalità di memoria

Preferisco gestire i carichi di lavoro orientati alla latenza senza Impegno eccessivo sulla RAM e moderatamente sulla vCPU. Il ballooning, la compressione e lo swap dell'hypervisor generano accessi esterni o picchi di errori di pagina, proprio ciò che voglio evitare. La condivisione trasparente delle pagine è inefficace in molte configurazioni e può offuscare la visione della vera località. Calibro la combinazione delle VM in modo che più istanze che richiedono molta larghezza di banda di memoria non entrino in conflitto sullo stesso nodo. Per i motori in memoria, pianifico generosamente Prenotazioni e, ove opportuno, pagine di grandi dimensioni nell'ospite che l'hypervisor può trasmettere. In questo modo, il tasso di successo TLB e i tempi di accesso rimangono prevedibili.

Migrazione live e alta disponibilità

Tengo conto del fatto che una Migrazione distruggo temporaneamente la località laterale di una VM. Dopo il trasferimento, riscaldo gli heap critici e lascio che i processi in background ricostruiscano gli hotset. Pianifico gli host di destinazione con una topologia NUMA simile, in modo che vNUMA non debba essere ridisegnato. Per i casi di HA con hardware eterogeneo, definisco delle politiche: o accetto una latenza temporaneamente più elevata, oppure do la priorità agli host con dimensioni dei nodi compatibili. È importante l'osservazione dopo la migrazione: se le percentuali di pagine remote aumentano, regolo le affinità o attivo il pre-faulting fino a quando il Località di nuovo adatto.

Modelli diagnostici pratici

Riconosco i tipici problemi NUMA da alcuni modelli: la CPU si surriscalda, ma il Istruzioni per ciclo rimangono bassi; la latenza oscilla; singoli thread bloccano gli accessi alla memoria, anche se i core sono liberi. In questi casi, controllo i remote hit, l'utilizzo dell'interconnessione, i TLB miss e la distribuzione dei thread attivi per nodo. Correlando il carico di interrupt con i core che supportano l'applicazione, verifico se le cache tra i nodi vengono costantemente invalidate. Un semplice controllo incrociato consiste nel ridurre la VM a un nodo: se le latenze diminuiscono immediatamente, la causa era lo spanning o lo scheduling. Allo stesso modo, test dedicati rivelano la larghezza di banda della RAM per nodo e mostrano se l'allestimento DIMM o le opzioni BIOS rallentano il sistema.

Lista di controllo pratica

  • Acquisizione della topologia: nodi, canali di memoria, mappatura PCIe, domini cache
  • Controllare il BIOS: Node Interleaving disattivato, profilo energetico Performance, C-States piatto
  • Taglio delle VM: vCPU per VM ≤ dimensione del nodo, vNUMA corretto, prestare attenzione all'hot add
  • Protezione della RAM: prenotazioni per carichi di lavoro con latenza, pagine enormi dove opportuno
  • Imposta affinità: collegare thread, IRQ e code I/O allo stesso nodo
  • Container/Pod: utilizzare l'affinità dei nodi, il gestore della CPU e la consapevolezza della topologia
  • Spanning solo in modo mirato: affiancare le grandi istanze con politiche e monitoraggio
  • Pianificare la migrazione: topologia di destinazione adeguata, pre-touch degli heap, osservare la località
  • Monitoraggio più accurato: accessi remoti, larghezza di banda per nodo, utilizzo dell'interconnessione
  • Test regolari: controlli della larghezza di banda/latenza dopo modifiche al firmware o all'host

Articoli attuali