Die NUMA-Architektur bestimmt, wie schnell moderne Server Threads mit Speicher versorgen und wie gut Workloads bei hoher Last skalieren. Ich zeige, warum lokale Speicherzugriffe Latenz und Bandbreite dominieren, wie Hypervisoren NUMA nutzen und welche Einstellungen in VMs direkte Leistungsgewinne freisetzen.
Zentrale Punkte
Ich fasse die wichtigsten Erkenntnisse kurz zusammen und hebe die Faktoren hervor, die in Rechenzentren den größten Effekt bringen.
- Lokaler Speicher minimiert Latenz und hebt Durchsatz
- NUMA-Knoten strukturieren CPUs und RAM effizient
- vCPU-Größe pro VM an Knotengröße anpassen
- Virtual NUMA an das Gast-OS durchreichen
- Spanning-Regeln für große RAM-Bedarfe definieren
Ich fokussiere konsequent auf Latenz und Datennähe, weil genau dort Serverleistung entschieden wird. Große Sockets, viele Kerne und viel RAM nützen wenig, wenn Threads ständig auf entfernte Speicherbereiche warten. Ich dimensioniere VMs so, dass sie in einen NUMA-Knoten passen und die Speicherallokation lokal bleibt. Hypervisor-Features unterstütze ich gezielt, statt alles global zu aktivieren. So sichere ich Skalierung ohne Überraschungen bei Lastspitzen.
Was NUMA wirklich ausmacht
Ich denke in Knoten: Jeder NUMA-Knoten vereint CPU-Kerne und einen lokalen RAM-Bereich mit sehr kurzen Zugriffswegen. Trifft ein Thread die Daten im L1, L2 oder L3 Cache, läuft alles extrem schnell; liegt der Datensatz im lokalen RAM, bleibt die Latenz niedrig. Greift der Thread jedoch auf einen anderen Knoten zu, steigt die Wartezeit und der Durchsatz fällt. Genau diese Unterschiede machen Non-Uniform Memory Access aus. Ich richte Workloads daher so aus, dass der Großteil der Zugriffe lokal bleibt.
Warum UMA an Grenzen stößt
UMA teilt allen Prozessoren einen gemeinsamen Speicherpfad zu, was bei steigender Kernzahl Stau erzeugt. Jeder zusätzliche Kern schiebt sich in dieselben Warteschlangen und konkurriert um Bandbreite. In vielen Alt-Setups sammelte sich so Latenz an, bis die CPU-Auslastung zwar hoch war, aber die Anwendung träge reagierte. Das fühlt sich wie „CPU am Limit“ an, obwohl der Engpass eigentlich im Speicherzugriff liegt. NUMA löst genau diese Blockaden durch lokale Pfade und Knoten-Topologie auf.
NUMA vs. UMA: Unterschiede im Überblick
Ich halte die wichtigsten Unterschiede gern in einer kompakten Tabelle fest, damit Entscheidungen schneller fallen. Diese Übersicht zeigt, worauf es bei Architektur, Latenz und Skalierung ankommt. Sie hilft mir beim Sizing neuer Hosts ebenso wie bei der Fehlersuche in produktiven Umgebungen. Wer den Unterschied zwischen lokalem und entferntem Zugriff klar sieht, trifft bessere Entscheidungen bei VM-Zuschnitt und RAM-Zuteilung. Genau hier entscheidet sich die Performance unter Last.
| Kriterium | NUMA | UMA | Praxiswirkung |
|---|---|---|---|
| Speicherzugriff | Lokal oder entfernt | Einheitlich | Lokale Zugriffe sind schneller; entfernte kosten Latenz |
| Skalierung | Sehr gut mit Knoten | Früh limitiert | Mehr Kerne skalieren verlässlicher bei NUMA |
| Topologie | Mehrere Knoten | Einheitlicher Pool | Topologie-bewusste Planung nötig |
| Hypervisor | Virtual NUMA verfügbar | Weniger relevant | Gast-OS kann NUMA-aware planen |
| Fein-Tuning | vCPU/RAM pro Knoten | Globales Tuning | Knotengerechte VMs liefern Stabilität |
NUMA in virtuellen Umgebungen
Ich lasse den Hypervisor die Topologie an das Gast-OS durchreichen, damit Scheduler und Speicherverwaltung lokal planen. Virtual NUMA zeigt dem Gast seine Knotengrenzen, wodurch Datenbanken, JVMs und .NET-Worker ihre Heaps und Threads günstiger anordnen. So vermeide ich teure Fernzugriffe und halte Latenz stabil. In sensiblen Setups kombiniere ich das mit konsequenter Pinning-Strategie und fester RAM-Zuteilung. Für extrem kurze Antwortzeiten ziehe ich zusätzlich Micro-Latency Hosting in Betracht, um Jitter weiter zu senken.
Best Practices für VM-Größen und CPU-Zuordnung
Ich dimensioniere vCPUs so, dass eine VM in einen NUMA-Knoten passt oder diesen nur knapp streift. Beispiel: Hat ein Host zwei Knoten à 20 Kerne, plane ich VMs mit 4 bis 16 vCPUs bevorzugt innerhalb eines Knotens. Wer darüber hinausgeht, riskiert Fernzugriffe und unnötige Wartezeiten. RAM verteile ich möglichst statisch, damit das Gast-OS seine Seiten lokal hält. Für Workloads mit starkem Single-Thread-Anteil beziehe ich die richtige Kern-Strategie mit ein und nutze Analysen wie Single-Thread vs. Multi-Core.
Konkrete Vorteile für Hosting-Hardware
Mit sauberer NUMA-Planung steigere ich die Dichte pro Host, ohne Reaktionszeiten zu opfern. In vielen Rechenzentren lassen sich so spürbar mehr VMs pro Sockel betreiben, während Anwendungen verlässlich reagieren. Kürzere Latenz zahlt direkt auf Nutzererlebnis und Batch-Durchsatz ein. Kosten pro Workload sinken, weil CPU-Zeit und RAM effizienter genutzt werden. Wer die Hardware-Auswahl fundiert trifft, profitiert zusätzlich von moderner High-Performance-Webhosting-Hardware mit hoher Speicherbandbreite.
Workload-Tuning: Datenbanken, Caches, Container
Ich achte darauf, dass Datenbanken ihre Heaps lokal halten und Worker-Threads auf „ihrem“ Knoten rechnen. Für SQL-Engines, In-Memory-Caches und JVMs lohnt sich eine feste Zuordnung von CPUs und Memory-Reservierung. Container-Orchestrierung profitiert von Knoten-Affinitäten, damit Pods die kürzesten Speicherwege nutzen. Bei starkem I/O setze ich auf NUMA-nahe NVMe-Zuweisungen, um Daten in Knoten-Nähe zu halten. So bleiben Hotpaths kurz und die Reaktionszeit freundlich.
Monitoring und Troubleshooting bei NUMA
Ich messe Latenz und Remote-Zugriffe gezielt, statt nur auf CPU-Prozente zu schauen. Tools zeigen mir pro Knoten, wie viele Seiten remote liegen und welche Threads Speicherdruck erzeugen. Steigen Remote-Misses, passe ich vCPU-Größe, Affinitäten oder RAM-Zuteilung an. Bleibt der Durchsatz trotz hoher CPU-Reserven schwach, stecken oft Speicherpfade dahinter. Sichtbarkeit auf Knotensicht ist für mich der schnellste Weg zu Ursachen, nicht nur zu Symptomen.
NUMA-Spanning: richtig einsetzen
Ich aktiviere Spanning gezielt für VMs mit sehr großem RAM-Bedarf oder außergewöhnlicher Bandbreite. Die VM darf dann Speicher über mehrere Knoten beziehen, was Einzel-Instanzen mit massivem Footprint überhaupt erst ermöglicht. Der Preis sind gelegentliche Fernzugriffe, die ich mit CPU-Affinitäten und größerem Page-Locality-Anteil abmildere. Bei Mischlasten wähle ich lieber mehrere mittelgroße VMs anstatt einer sehr großen Instanz. So bleibt Planbarkeit im Alltag erhalten.
Lizenzierung, Dichte und reale Kosten
Ich bewerte Kosten nicht auf Host-Ebene, sondern pro Workload und Monat in Euro. Wenn NUMA die VM-Dichte steigert, sinken die Fixkosten je Instanz und die Leistungsreserven steigen. Das wirkt sich auf Lizenzen pro Kern ebenso aus wie auf Support- und Energiekosten. Wer Remote-Zugriffe reduziert, verkürzt Rechenzeit und spart Energie bei gleicher Aufgabe. Am Ende zählt die Gesamtbilanz aus Euro pro Ergebnis, nicht nur Euro pro Server.
Hardware-Topologie und Interconnects richtig lesen
Ich beziehe die physische Topologie aktiv in meine Planung ein. Moderne Server nutzen mehrteilige CPU-Designs und verbinden Chiplets oder Dies über Interconnects. Das bedeutet: Nicht jeder Kern hat den gleichen Weg zu jedem RAM-Modul, und selbst innerhalb eines Sockets gibt es bevorzugte Pfade. Je mehr Traffic über die Socket-übergreifenden Links läuft, desto stärker steigen Latenz und Coherency-Overhead. Ich prüfe daher, wie viele Speicherkanäle pro Knoten aktiv sind, ob alle DIMM-Slots symmetrisch bestückt sind und wie die Knoten im Mainboard verschaltet sind. Sub-NUMA-Features, die Knoten in kleinere Domänen teilen, können Hotspots entzerren, wenn Workloads klar segmentiert sind. Ich beobachte außerdem die L3-Topologie: Liegen Threads und ihre Daten in unterschiedlichen Cache-Domänen, kostet allein der Cache-Transfer spürbar Leistung. Ein einfacher Bandbreitentest und eine Topologie-Übersicht zeigen schnell, ob die Plattform die erwartete Lokalitität liefert oder ob Interconnects zum Nadelöhr werden.
Firmware- und BIOS-Optionen mit Wirkung
Ich stelle im BIOS sicher, dass Node Interleaving deaktiviert ist, damit die NUMA-Struktur sichtbar bleibt. Sub-NUMA-Clustering oder vergleichbare Modi setze ich gezielt ein, wenn Workloads viele mittelgroße, klar getrennte Arbeitsmengen besitzen. Für konsistente Latenzen wähle ich Performance-orientierte Energieprofile, reduziere tiefere C-States und vermeide aggressives Core-Parking. Speicherbestückung optimiere ich für volle Speicherkanal-Bandbreite; unsymmetrische DIMM-Konfigurationen schlagen direkt auf Durchsatz und Wartezeit durch. Ich prüfe zudem Prefetcher- und RAS-Optionen: Manche Schutzmechanismen erhöhen die Latenz, ohne dem Workload zu dienen. Wichtig: Jede BIOS-Anpassung teste ich mit realer Last, denn Mikroeffekte durch Caches und Interconnects zeigen sich oft erst unter Druck.
Gast-OS und Runtime-Tuning: von First-Touch bis Huge Pages
Im Gast nutze ich First-Touch-Allokation zu meinem Vorteil: Threads initialisieren „ihren“ Speicher, damit Seiten lokal angelegt werden. Unter Linux setze ich je nach Workload automatisches NUMA-Balancing gezielt ein oder aus; datenbanknahe Systeme profitieren oft von stabiler Bindung, während verteilte Web-Worker geringe Migrationen verkraften. Mit numactl oder Task-Pinning binde ich Dienste an Knoten und definiere membind-Richtlinien. Huge Pages reduziere TLB-Pressure; bei latenzkritischen Datenbanken bevorzuge ich statische Huge Pages und warmen Speicher (Pre-Touch), um Page-Fault-Spitzen zu vermeiden. Transparent Huge Pages betreibe ich je nach Engine auf „madvise“ oder deaktiviert, wenn sie Defragmentierungslatenzen erzeugen. Ich steuere IRQ-Affinitäten und verteile Netzwerk- und NVMe-Interrupts auf den passenden Knoten; RPS/XPS und Mehrfach-Queues helfen, Datenpfade konsistent zu halten. Unter Windows nutze ich Processor Groups und Soft-NUMA im Stack, sorge für „Lock Pages in Memory“ bei speicherintensiven Diensten und aktiviere Server-GC bei .NET. Für JVMs setze ich NUMA-bewusste Heuristiken, pre-touche Heaps und steuere die Thread-Affinität, damit GC und Worker die gleichen Knoten nutzen.
Hypervisor-spezifische Einstellungen sauber ausrichten
Ich passe die vNUMA-Topologie an die physische Struktur an. Die Parameter „Sockets“, „Cores per Socket“ und „Threads per Core“ wähle ich so, dass der Hypervisor die VM nicht über Knoten zerschneidet. Für latenzsensible Instanzen reserviere ich RAM, damit weder Ballooning noch Swapping zuschlagen, und ich sichere pCPU-Ressourcen via Affinität oder passenden Scheduler-Optionen. Achtung bei CPU- oder Memory-Hot-Add: Viele Plattformen deaktivieren damit vNUMA im Gast – die Folge sind versteckte Fernzugriffe. Live-Migration plane ich so, dass Zielhosts eine kompatible NUMA-Topologie aufweisen, und ich gebe VMs nach Migration Zeit, ihre Seitenlokalität neu aufzubauen (Pre-Touch, Warmlauf). In KVM-Umgebungen nutze ich die NUMA-Tuning-Optionen und cpuset-Cgroups; in anderen Hypervisoren helfen esxtop/ähnliche Tools, um vCPU-Verteilung und Node-Hits in Echtzeit zu sehen.
PCIe- und I/O-Lokalität nicht verschenken
Ich ordne NVMe-Laufwerke, HBAs und NICs dem Knoten zu, auf dem die rechnenden Threads laufen. SR-IOV- oder vNIC-Queues binde ich an Kerne desselben Knoten und steuere Interrupts entsprechend. Für hohe Paket-Raten skaliere ich Receive-/Transmit-Queues und verteile sie konsistent über die lokalen Kerne. Bei Storage-Stacks achte ich darauf, dass Worker-Threads für I/O-Submits und Completions auf dem gleichen Knoten arbeiten, damit der Datenpfad nicht quer über den Interconnect läuft. Auch Multipathing und Software-RAID plane ich knotenspezifisch; ein „kürzerer“ Pfad schlägt fast immer den „breiteren“ Pfad mit Fremdzugriffen. So reduziere ich Jitter und bringe unter I/O-Last die CPU-Zeit dorthin, wo sie Wirkung hat.
Kapazitätsplanung, Overcommit und Memory-Features
Latenzorientierte Workloads betreibe ich bevorzugt ohne Overcommit auf RAM und moderat auf vCPU. Ballooning, Kompression und Hypervisor-Swap erzeugen Fremdzugriffe oder Page-Fault-Spitzen – genau das möchte ich vermeiden. Transparent Page Sharing ist in vielen Setups wirkungslos und kann die Sicht auf echte Lokalitität verschleiern. Ich kalibriere die Mischung der VMs so, dass nicht mehrere speicherbandbreitenhungrige Instanzen auf dem gleichen Knoten kollidieren. Für In-Memory-Engines plane ich großzügige Reservierungen und, wo sinnvoll, Huge Pages im Gast, die der Hypervisor durchreichen kann. So bleiben TLB-Hitrate und Zugriffszeiten vorhersagbar.
Live-Migration und Hochverfügbarkeit
Ich berücksichtige, dass eine Migration die Seitenlokalität einer VM temporär zerstört. Nach dem Umzug wärme ich kritische Heaps an und lasse Hintergrundjobs die Hotsets neu aufbauen. Zielhosts plane ich mit ähnlicher NUMA-Topologie, damit vNUMA nicht neu geschnitten werden muss. Für HA-Fälle mit heterogener Hardware lege ich Policies fest: Entweder akzeptiere ich kurzzeitig höhere Latenz, oder ich priorisiere Hosts mit kompatibler Knotengröße. Wichtig ist die Beobachtung nach Migration: Steigen Remote-Page-Anteile, justiere ich Affinitäten oder triggere Pre-Faulting, bis die Locality wieder passt.
Praktische Diagnosemuster
Typische NUMA-Probleme erkenne ich an wenigen Mustern: Die CPU läuft „heiß“, aber die Instructions per Cycle bleiben niedrig; die Latenz springt in Wellen; einzelne Threads blockieren auf Speicherzugriffe, obwohl Kerne frei sind. In solchen Fällen schaue ich auf Remote-Hits, Interconnect-Auslastung, TLB-Misses und die Verteilung aktiver Threads pro Knoten. Ich korreliere Interrupt-Last mit den Kernen, die die Anwendung tragen, und prüfe, ob Caches zwischen Knoten ständig invalidiert werden. Eine einfache Gegenprobe ist das Verkleinern der VM auf einen Knoten: Fallen die Latenzen sofort, war Spanning oder Scheduling die Ursache. Ebenso entlarven dedizierte Tests die RAM-Bandbreite pro Knoten und zeigen, ob DIMM-Bestückung oder BIOS-Optionen bremsen.
Praxis-Checkliste
- Topologie erfassen: Knoten, Speicherkanäle, PCIe-Zuordnung, Cache-Domänen
- BIOS prüfen: Node Interleaving aus, Energieprofil Performance, C-States flach
- VMs schneiden: vCPUs pro VM ≤ Knotengröße, vNUMA korrekt, Hot-Add beachten
- RAM sichern: Reservierungen für Latenz-Workloads, Huge Pages wo sinnvoll
- Affinität setzen: Threads, IRQs, I/O-Queues an denselben Knoten binden
- Container/Pods: Knoten-Affinität, CPU-Manager und Topology-Awareness nutzen
- Spanning nur gezielt: Große Instanzen mit Policies und Monitoring flankieren
- Migration planen: Zieltopologie passend, Heaps pre-touch, Locality beobachten
- Monitoring schärfen: Remote-Zugriffe, Bandbreite pro Knoten, Interconnect-Auslastung
- Regelmäßig testen: Bandbreiten-/Latenz-Checks nach Firmware- oder Host-Wechseln


