...

NUMA-architectuur: waarom deze een belangrijke rol speelt in moderne servers

De NUMA-architectuur bepaalt hoe snel moderne servers threads van geheugen voorzien en hoe goed workloads bij hoge belasting schalen. Ik laat zien waarom lokale geheugentoegang latentie en bandbreedte domineren, hoe hypervisors NUMA gebruiken en welke instellingen in VM's directe prestatieverbeteringen opleveren.

Centrale punten

Ik vat de belangrijkste bevindingen kort samen en benadruk de factoren die in datacenters het grootste effect hebben.

  • Lokaal geheugen Minimaliseert latentie en verhoogt de doorvoer
  • NUMA-knooppunt structureren CPU's en RAM efficiënt
  • vCPU-grootte aanpassen aan knooppuntgrootte per VM
  • Virtuele NUMA doorgeven aan het gast-OS
  • Spanningregels voor grote RAM-behoeften definiëren

Ik concentreer me consequent op Latency en datanabijheid, omdat daar precies de serverprestaties worden bepaald. Grote sockets, veel cores en veel RAM hebben weinig nut als threads voortdurend op externe geheugengebieden moeten wachten. Ik dimensioner VM's zo dat ze in een NUMA-knooppunt passen en de geheugentoewijzing lokaal blijft. Ik ondersteun hypervisor-functies gericht, in plaats van alles globaal te activeren. Zo zorg ik voor Schalen zonder verrassingen bij piekbelastingen.

Wat NUMA echt bijzonder maakt

Ik denk in Knooppunt: Elke NUMA-knooppunt combineert CPU-kernen en een lokaal RAM-gebied met zeer korte toegangstijden. Als een thread de gegevens in de L1-, L2- of L3-cache vindt, verloopt alles extreem snel; als het gegevensrecord zich in het lokale RAM bevindt, blijft de latentie laag. Als de thread echter toegang zoekt tot een ander knooppunt, neemt de wachttijd toe en daalt de doorvoer. Juist deze verschillen maken Niet-uniform Memory Access uit. Ik richt workloads daarom zo in dat het grootste deel van de toegang lokaal blijft.

Waarom UMA zijn grenzen bereikt

UMA deelt alle processors een gemeenschappelijke opslagpad wat bij een toenemend aantal kernen tot opstoppingen leidt. Elke extra kern voegt zich in dezelfde wachtrijen en concurreert om bandbreedte. In veel oude opstellingen stapelde de latentie zich zo op, totdat de CPU-belasting weliswaar hoog was, maar de toepassing traag reageerde. Dat voelt aan als „CPU op zijn limiet“, hoewel de bottleneck eigenlijk in de geheugentoegang ligt. NUMA lost precies dit probleem op. Verstoppingen door lokale paden en knooppuntentologie.

NUMA versus UMA: overzicht van de verschillen

Ik zet graag de belangrijkste verschillen in een compact overzicht op een rijtje. Tabel vast, zodat beslissingen sneller kunnen worden genomen. Dit overzicht laat zien wat belangrijk is op het gebied van architectuur, latentie en schaalbaarheid. Het helpt me bij het dimensioneren van nieuwe hosts en bij het opsporen van fouten in productieve omgevingen. Wie het verschil tussen lokale en externe toegang duidelijk ziet, neemt betere beslissingen bij het afstemmen van VM's en het toewijzen van RAM. Precies hier wordt de beslissing genomen. Prestaties onder belasting.

Criterium NUMA UMA Praktisch effect
toegang tot het geheugen Lokaal of op afstand Gestandaardiseerd Lokale toegangen zijn sneller; externe toegangen kosten latentie.
Schalen Zeer goed met knopen Vroeg beperkt Meer cores schalen betrouwbaarder bij NUMA
Topologie Meerdere knooppunten Uniforme pool Topologiebewuste planning noodzakelijk
hypervisor Virtual NUMA beschikbaar Minder relevant Gast-OS kan NUMA-bewust plannen
Fijnafstemming vCPU/RAM per knooppunt Wereldwijde afstemming Knooppuntvriendelijke VM's zorgen voor stabiliteit

NUMA in virtuele omgevingen

Ik laat de hypervisor de Topologie doorgeven aan het gast-OS, zodat de planner en het geheugenbeheer lokaal kunnen plannen. Virtual NUMA toont de gast zijn knooppuntgrenzen, waardoor databases, JVM's en .NET-workers hun heaps en threads gunstiger kunnen ordenen. Zo vermijd ik dure externe toegang en houd ik de latentie stabiel. In gevoelige opstellingen combineer ik dit met een consequente pinning-strategie en vaste RAM-toewijzing. Voor extreem korte responstijden trek ik bovendien Micro-latency hosting in overweging om jitter verder te verminderen.

Best practices voor VM-groottes en CPU-toewijzing

Ik dimensioner vCPU's zodat een VM in een NUMA-knooppunt past of deze slechts licht raakt. Voorbeeld: als een host twee knooppunten met elk 20 cores heeft, plan ik VM's met 4 tot 16 vCPU's bij voorkeur binnen één knooppunt. Wie daar bovenuit gaat, riskeert externe toegang en onnodige wachttijden. Ik verdeel RAM zo statisch mogelijk, zodat het gast-OS zijn pagina's lokaal houdt. Voor workloads met een sterk single-thread-aandeel houd ik rekening met de juiste kernstrategie en maak ik gebruik van analyses zoals Single-thread vs. multi-core.

Concrete voordelen voor hostinghardware

Met een goed NUMA-ontwerp verhoog ik de dichtheid per host, zonder dat dit ten koste gaat van de reactietijden. In veel datacenters kunnen zo aanzienlijk meer VM's per socket worden gebruikt, terwijl applicaties betrouwbaar reageren. Kortere latentie komt direct ten goede aan de gebruikerservaring en batchdoorvoer. De kosten per workload dalen omdat CPU-tijd en RAM efficiënter worden gebruikt. Wie een weloverwogen keuze maakt op het gebied van hardware, profiteert bovendien van moderne High-performance webhostinghardware met hoge geheugenbandbreedte.

Workload-tuning: databases, caches, containers

Ik zorg ervoor dat Databases hun heaps lokaal houden en worker-threads op „hun“ knooppunt berekenen. Voor SQL-engines, in-memory-caches en JVM's is een vaste toewijzing van CPU's en geheugenreservering de moeite waard. Containerorkestratie profiteert van knooppuntaffiniteiten, zodat pods de kortste opslagpaden gebruiken. Bij zware I/O vertrouw ik op NUMA-achtige NVMe-toewijzingen om gegevens in de buurt van knooppunten te houden. Zo blijven hotpaths kort en de Reactietijd vriendelijk.

Monitoring en probleemoplossing bij NUMA

Ik meet Latency en remote-toegang gericht, in plaats van alleen naar CPU-percentages te kijken. Tools laten me per knooppunt zien hoeveel pagina's remote zijn en welke threads geheugendruk genereren. Als remote-misses toenemen, pas ik de vCPU-grootte, affiniteiten of RAM-toewijzing aan. Als de doorvoer ondanks hoge CPU-reserves zwak blijft, ligt dat vaak aan geheugenpaden. Zichtbaarheid op knooppuntniveau is voor mij de snelste manier om Oorzaken, niet alleen naar symptomen.

NUMA-spanning: correct gebruik

Ik activeer Spanning specifiek voor VM's met een zeer grote RAM-behoefte of uitzonderlijke bandbreedte. De VM mag dan geheugen van meerdere knooppunten gebruiken, wat enkelvoudige instanties met een enorme footprint überhaupt mogelijk maakt. De prijs hiervoor is incidentele externe toegang, die ik verzacht met CPU-affiniteiten en een groter aandeel paginalocaliteit. Bij gemengde belastingen geef ik de voorkeur aan meerdere middelgrote VM's in plaats van één zeer grote instantie. Zo blijft Planbaarheid in het dagelijks leven behouden.

Licenties, dichtheid en werkelijke kosten

Ik beoordeel Kosten niet op hostniveau, maar per workload en maand in euro's. Wanneer NUMA de VM-dichtheid verhoogt, dalen de vaste kosten per instantie en stijgen de prestatiereserves. Dit heeft zowel invloed op licenties per kern als op ondersteunings- en energiekosten. Wie het aantal externe toegangen vermindert, verkort de rekentijd en bespaart energie bij dezelfde taak. Uiteindelijk telt het Balans per resultaat, niet alleen per server.

Hardwaretopologie en interconnects correct interpreteren

Ik verwijs naar de fysieke Topologie actief in mijn planning. Moderne servers maken gebruik van meerdelige CPU-ontwerpen en verbinden chiplets of dies via interconnects. Dat betekent dat niet elke kern dezelfde weg naar elke RAM-module heeft, en zelfs binnen een socket zijn er voorkeursroutes. Hoe meer verkeer er over de socket-overschrijdende links loopt, hoe sterker de stijging. Latency en coherentie-overhead. Daarom controleer ik hoeveel geheugenkanalen per knooppunt actief zijn, of alle DIMM-slots symmetrisch zijn uitgerust en hoe de knooppunten in het moederbord zijn geschakeld. Sub-NUMA-functies, die knooppunten in kleinere domeinen verdelen, kunnen hotspots egaliseren als workloads duidelijk zijn gesegmenteerd. Ik observeer ook de L3-topologie: Als threads en hun gegevens zich in verschillende cache-domeinen bevinden, kost alleen al de cache-overdracht merkbaar prestatievermogen. Een eenvoudige bandbreedtetest en een topologieoverzicht laten snel zien of het platform de verwachte lokaliteit levert of dat interconnects een bottleneck worden.

Firmware- en BIOS-opties met effect

Ik controleer in het BIOS of Node-interleaving is uitgeschakeld, zodat de NUMA-structuur zichtbaar blijft. Ik gebruik sub-NUMA-clustering of vergelijkbare modi specifiek wanneer workloads veel middelgrote, duidelijk gescheiden hoeveelheden werk bevatten. Voor consistente latenties kies ik prestatiegerichte energieprofielen, verminder ik diepere C-staten en vermijd agressief core-parking. Ik optimaliseer de geheugenconfiguratie voor volledige Geheugenkanaalbandbreedte; asymmetrische DIMM-configuraties hebben een directe invloed op de doorvoer en wachttijd. Ik controleer ook prefetcher- en RAS-opties: sommige beveiligingsmechanismen verhogen de latentie zonder dat dit de werklast ten goede komt. Belangrijk: ik test elke BIOS-aanpassing met een reële belasting, omdat micro-effecten door caches en interconnects vaak pas onder druk zichtbaar worden.

Gast-OS en runtime-tuning: van first-touch tot huge pages

In Gast gebruik ik Eerste aanraking-Toewijzing in mijn voordeel: threads initialiseren „hun“ geheugen, zodat pagina's lokaal worden aangemaakt. Onder Linux schakel ik automatische NUMA-balancing gericht in of uit, afhankelijk van de werklast; databasegerichte systemen profiteren vaak van een stabiele binding, terwijl gedistribueerde webwerkers kleine migraties aankunnen. Met numactl of task-pinning bind ik diensten aan knooppunten en definieer ik membind-richtlijnen. Enorme pagina's Verminder TLB-druk; bij latentiegevoelige databases geef ik de voorkeur aan statische Huge Pages en warm geheugen (Pre-Touch) om pieken in page faults te voorkomen. Transparent Huge Pages gebruik ik, afhankelijk van de engine, op „madvise“ of gedeactiveerd als ze defragmentatielatenties veroorzaken. Ik stuur IRQ-affiniteiten en verdeel netwerk- en NVMe-interrupts over de juiste knooppunten; RPS/XPS en meerdere wachtrijen helpen om datapaden consistent te houden. Onder Windows gebruik ik Processor Groups en Soft-NUMA in de stack, zorg ik voor „Lock Pages in Memory“ bij geheugenintensieve diensten en activeer ik Server-GC bij .NET. Voor JVM's gebruik ik NUMA-bewuste heuristieken, pre-touche heaps en stuur ik de thread-affiniteit aan, zodat GC en worker dezelfde knooppunten gebruiken.

Hypervisor-specifieke instellingen netjes uitlijnen

Ik pas de vNUMA-topologie aan de fysieke structuur. Ik kies de parameters „Sockets“, „Cores per Socket“ en „Threads per Core“ zo dat de hypervisor de VM niet over knooppunten verdeelt. Voor latentiegevoelige instanties reserveer ik RAM, zodat er geen ballooning of swapping optreedt, en ik beveilig pCPU-bronnen via affiniteit of geschikte scheduleropties. Let op bij CPU- of geheugen-hot-add: veel platforms deactiveren hiermee vNUMA in de gast, met als gevolg verborgen externe toegang. Ik plan live-migratie zo dat doelhosts een compatibele NUMA-topologie hebben en ik geef VM's na migratie de tijd om hun Pagina-locatie opnieuw opbouwen (pre-touch, warmloop). In KVM-omgevingen gebruik ik de NUMA-tuningopties en cpuset-Cgroups; in andere hypervisors helpen exstop/soortgelijke tools om vCPU-distributie en node-hits in realtime te zien.

PCIe- en I/O-lokaliteit niet verspillen

Ik organiseer NVMe-schijven, HBA's en NIC's aan het knooppunt waarop de rekenende threads draaien. SR-IOV- of vNIC-wachtrijen koppel ik aan kernen van hetzelfde knooppunt en stuur ik interrupts dienovereenkomstig aan. Voor hoge pakketsnelheden schaal ik ontvangst-/verzendwachtrijen en verdeel ik ze consistent over de lokale kernen. Bij opslagstacks zorg ik ervoor dat werkthreads voor I/O-submits en -completions op hetzelfde knooppunt werken, zodat het gegevenspad niet over de interconnect loopt. Ook multipathing en software-RAID plan ik knooppuntspecifiek; een „korter“ pad verslaat bijna altijd het „bredere“ pad met externe toegang. Zo verminder ik jitter en breng ik onder I/O-belasting de CPU-tijd naar waar het effect heeft.

Capaciteitsplanning, overcommit en geheugenfuncties

Ik geef er de voorkeur aan om latentiegerichte workloads zonder te gebruiken. Overcommit op RAM en matig op vCPU. Ballooning, compressie en hypervisor-swap veroorzaken externe toegang of pieken in paginastoringen – en dat is precies wat ik wil vermijden. Transparante paginadeling is in veel opstellingen niet effectief en kan het zicht op echte lokaliteit vertroebelen. Ik kalibreer de mix van VM's zodanig dat er niet meerdere instanties die veel geheugenbandbreedte nodig hebben op hetzelfde knooppunt botsen. Voor in-memory-engines plan ik royale Reserveringen en, waar zinvol, Huge Pages in de gast, die de hypervisor kan doorgeven. Zo blijven TLB-hitrate en toegangstijden voorspelbaar.

Live migratie en hoge beschikbaarheid

Ik houd er rekening mee dat een Migratie de zijlocatie van een VM tijdelijk vernietigd. Na de verhuizing warm ik kritieke heaps op en laat ik achtergrondtaken de hotsets opnieuw opbouwen. Ik plan doelhosts met een vergelijkbare NUMA-topologie, zodat vNUMA niet opnieuw hoeft te worden gesneden. Voor HA-gevallen met heterogene hardware stel ik beleidsregels vast: ofwel accepteer ik tijdelijk een hogere latentie, ofwel geef ik voorrang aan hosts met een compatibele knooppuntgrootte. Belangrijk is de observatie na de migratie: als het aandeel van remote pages toeneemt, pas ik affiniteiten aan of trigger ik pre-faulting totdat de Locality weer past.

Praktische diagnosemodellen

Ik herken typische NUMA-problemen aan een paar patronen: de CPU loopt „heet“, maar de Instructies per cyclus blijven laag; de latentie schommelt; afzonderlijke threads blokkeren bij geheugentoegang, hoewel er cores vrij zijn. In dergelijke gevallen kijk ik naar remote hits, interconnect-gebruik, TLB-misses en de verdeling van actieve threads per node. Ik correleer de interrupt-belasting met de cores die de applicatie dragen en controleer of caches tussen nodes voortdurend ongeldig worden gemaakt. Een eenvoudige tegenproef is het verkleinen van de VM tot één knooppunt: als de latentie onmiddellijk daalt, was spanning of scheduling de oorzaak. Op dezelfde manier onthullen speciale tests de RAM-bandbreedte per knooppunt en laten ze zien of DIMM-configuratie of BIOS-opties vertragend werken.

Praktische checklist

  • Topologie vastleggen: knooppunten, geheugenkanalen, PCIe-toewijzing, cache-domeinen
  • BIOS controleren: Node Interleaving uit, energieprofiel Prestaties, C-States vlak
  • VM's knippen: vCPU's per VM ≤ knooppuntgrootte, vNUMA correct, let op hot-add
  • RAM beveiligen: reserveringen voor latentie-workloads, Huge Pages waar zinvol
  • Affiniteit instellen: threads, IRQ's, I/O-wachtrijen aan hetzelfde knooppunt koppelen
  • Containers/pods: gebruik maken van knooppuntaffiniteit, CPU-manager en topologiebewustzijn
  • Spanning alleen gericht: grote instanties flankeren met beleid en monitoring
  • Migratie plannen: doel-topologie geschikt, heaps pre-touch, localiteit observeren
  • Monitoring aanscherpen: externe toegang, bandbreedte per knooppunt, interconnect-gebruik
  • Regelmatig testen: bandbreedte-/latentiecontroles na firmware- of hostwijzigingen

Huidige artikelen