Suchen
Verloren im Labyrinth der IT-Begriffe? Hier finden Sie Definitionen und Basiswissen zu Rechenzentrums-IT und -Infrastruktur.

Knoten-Netzwerke für Mehrprozessor-Systeme Was ist NUMA?

| Autor / Redakteur: M.A. Jürgen Höfling / Ulrike Ostler

Mehr-Prozessor-Systeme bringen nur mit ausreichend Arbeitsspeicher, der schnell verfügbar ist, eine gute Leistung. Architekturen wie Non-Uniform Memory Access (NUMA) können hier helfen. Das Zusammenspiel mit virtuellen Konzepten ist aber nicht einfach

Non-Uniform Memory Access (NUMA) stellt jedem Prozessor genügend Speicher zur Verfügung zu stellen, so dass parallele Prozesse nahtlos und blockadefrei ineinandergreifen können.
Non-Uniform Memory Access (NUMA) stellt jedem Prozessor genügend Speicher zur Verfügung zu stellen, so dass parallele Prozesse nahtlos und blockadefrei ineinandergreifen können.
(Bild: © djama - stock.adob.com)

Parallelverarbeitung hat in der IT mittlerweile auf breiter Front die ursprüngliche von-Neumann-Architektur - Befehlssatz und Daten in einem einheitlichen Speicherraum - abgelöst. Hochleistungsrechner bauen auf Multi-Kern-, Multi-Prozessor oder auch Multi-Socket-Systemen. Und diese Elemente „jonglieren“ darüber hinaus auch noch mit quasi-parallelen nebenläufigen Prozessen (Threads).

Parallelverarbeitung hat freilich ihre ganz eigenen Tücken. Nur wenn eine Aufgabe sinnvoll parallelisiert werden kann, führt das simultane Arbeiten mehrerer Prozessoren wirklich zu Geschwindigkeits-Vorteilen. Wenn diese Voraussetzung nicht gegeben ist oder wenn die Parallelisierung nicht oder nicht intelligent genug angegangen wird, bringt Parallelverarbeitung im besten Fall nichts, oft sogar eine Verschlechterung der Gesamtleistung.

Die Gründe für eine schlechte Performance sind vielfältig. Das Spektrum reicht von mangelnder Koordination der parallelen Arbeitsschritte aufgrund von Kommunikations-Defiziten über nicht-kohärente Daten in den jeweiligen Speicherbereichen beziehungsweise wechselseitigen Blockaden bei den Speicherzugriffen bis zu einer ungeschickten Parallelisierung der Workload oder der schlichten Tatsache, dass die Aufgabe gar nicht sinnvoll parallelisiert werden kann.

Die NUMA-Knoten

Um Blockaden beim wechselseitigen Konkurrieren der Prozessoren um Arbeitsspeicher zu verhindern, könnte man einfach einen großen Datenbus „spendieren“, so dass immer genug Bandbreite vorhanden ist. Das ist aber teuer und konterkariert damit die Vorteile, die sich durch die Multiprozessor-Verarbeitung im Prinzip bieten. Auch ist eine solche „Brute-force“-Methode wenig skalierbar. Insofern sollte mehr Intelligenz bei der Organisation der Speicherzugriffe das Mittel der Wahl sein, damit Parallelverarbeitung nicht zu einem „Außer Spesen nichts gewesen“ wird.

Die Methode des Non-Uniform Memory Access (NUMA) ist ein solch intelligenter Ansatz, um jedem Prozessor genügend Speicher zur Verfügung zu stellen, so dass die parallelen Prozesse nahtlos und blockadefrei ineinandergreifen.

Konkret besteht der NUMA-Ansatz aus einem Geflecht von kostengünstigen Knoten aus jeweils einem Prozessor mit separatem lokalem Arbeitsspeicher. Die Knoten sind durch eine Hochleistungsverbindung miteinander verknüpft. Zusätzlich gibt jeder der Knoten den anderen Knoten über einen gemeinsamen Adressraum Zugriff auf den jeweiligen lokalen Speicher. Dieser Zugriff wird durch spezielle Speichercontroller gesteuert und überwacht.

Cache-Kohärenz im Blick

Je nachdem, ob auf den eigenen oder auf einen benachbarten Arbeitsspeicher zugegriffen wird, sind diese Zugriffe unterschiedlich schnell, sprich uneinheitlich, daher der Name „Non-Uniform Memory Access.

Darüber hinaus entsteht durch Zugriffe auf benachbarte Speicher ein Kohärenzproblem im Cache-Speicher des jeweiligen Prozessors. Wenn ein fremder Prozessor im lokalen Bereich des Nachbarn Berechnungen durchführt hat und den Speicher verändert, ist es deshalb sinnvoll, die Cache-Speicher der beiden involvierten NUMA-Knoten auf einen gemeinsamen Stand zu bringen und damit die Cache-Kohärenz zu gewährleisten. Derartige Synchronisierungs-Operationen erfordern natürlich zusätzliche Kommunikation zwischen den Prozessoren.

Wenn man so will, ist es paradox: Eigentlich lebt der „Non-Uniform Memory Access“ davon, dass der uneinheitliche Zugriff möglichst wenig genutzt wird, dass also die Arbeitslasten möglichst umfassend von der zu Anfang gewählten Architektur der NUMA-Knoten „ohne Arbeitsspeicher-Fremdgehen“ bewältigt werden können. Ansonsten wird es eher kompliziert, weil unvorhergesehene Bremswirkungen die vermeintlichen Vorteile auffressen oder gar zu erheblichen Nachteilen werden lassen.

NUMA-Architektur und virtuelle Maschinen

Die NUMA-Architektur sollte unbedingt im Vorhinein bezüglich der auftretenden Arbeitslasten gut berechnet und daraufhin ausbalanciert werden, ansonsten ist das Desaster vorprogrammiert. Mittlerweile gibt es viele Hilfsmittel, damit man die Balance hinbekommt. Zum einen wurde die Hardware-Entwicklung immer mehr in Richtung NUMA-Knoten verfeinert, beispielsweise durch entsprechende Arbeitsspeicher-Controller-Bausteine. Und zum anderen sind die verschiedenen Betriebssysteme zunehmend auf die technischen Anforderungen von NUMA-Architekturen ausgerichtet, bei Windows ebenso wie bei den verschiedenen Linux-Distributionen.

NUMA und dynamische Speicherzuteilung

Ein vertracktes Problem ist aber das Zusammenspiel der NUMA-Architektur mit der Technologie der virtuellen Maschinen a la „Microsoft Hyper-V“, „VMware vSphere“ oder „Xen Server“. Hier stoßen sich unter Umständen, wenn man nicht aufpasst, die „Dinge hart im Raum“. Wie lassen sich die Aufteilung der Arbeitslast auf die NUMA-Architektur und der Verteilmechanismus des jeweiligen virtuellen Betriebssystems so unter einen Hut bringen, dass sie die Verarbeitung beschleunigen und nicht ausbremsen?

Spätestens mit den Möglichkeiten der dynamischen Speicherzuteilung scheinen Konflikte vorprogrammiert, und zwar umso mehr, je mehr Spielräume man den virtuellen Maschinen bei der flexiblen Speicherzuteilung einräumt. Es liegt auf der Hand, dass man beispielsweise einer virtuellen Maschine nicht mehr RAM zuweisen sollte, als ein NUMA-Knoten auf dieser Maschine besitzt.

Auch wenn diese Maxime in der Theorie sonnenklar scheint, ist die praktische Umsetzung nicht einfach. Schließlich arbeiten virtuelle Maschinen mit logischen Zentraleinheiten, die bei Systemen, die Hyperthreading unterstützen, nicht identisch mit der physischen CPU sind. So umfasst ein Core normalerweise zwei logische Prozessoren.

Dazu ein Rechenbeispiel: Würde man hardwaremäßig die NUMA-Knoten auf die Thread-Ebene abbilden; dann erhielte man im Falle einer 2-Wege-Maschine mit 6-Core-CPU 24 Knoten. Das ist ein sehr komplexes Gebilde. Um hier die Komplexität zu reduzieren, fasst man deshalb oft mehrere Cores in einem NUMA-Knoten zusammen. Das Design des NUMA-Systems ist für den Anwender nicht unmittelbar erkennbar, Tools wie Sysinternals Coreinfo (für Microsoft-Systeme) oder numactl (für Linux-Systeme) bringen hier aber Aufklärung.

Gegenläufige Tendenzen von NUMA und VM

NUMA-Architektur und dynamische Speicherzuweisung in der Welt der virtuellen Maschinen (VM) sind also eine delikate Angelegenheit. Wenn der zur Verfügung stehende Arbeitsspeicher dynamisch geändert wird, erhöht sich zwangsläufig die Wahrscheinlichkeit, dass eine Prozessoreinheit „fremdgehen“ muss und durch diesen Speicherzugriff in „Nachbars Garten“ die Performance leidet.

Zwar bieten virtuelle Systeme mittlerweile automatische Mechanismen, um NUMA-Architektur und virtuelle Speicherzuweisung auszubalancieren, bei VM mit besonders anspruchsvollen Anwendungen ist es aber allemal sicherer, auf NUMA-Maschinen nur mit statischem Arbeitsspeicher zu arbeiten. Zumindest in diesen kritischen Anwendungen sollte die optimale Auslastung des Hosts der Performance hintangestellt werden.

Festzuhalten bleibt: auch wenn NUMA und VM beide das „Arbeitsspeicher-Fremdgehen“ auf ein Mindestmaß reduzieren wollen und insofern gleiche Ziele verfolgen, haben beide Mechanismen auch gegenläufige Tendenzen und sind zumindest nicht auf einfache Weise ins Gleichgewicht zu bringen.

(ID:46669560)

Über den Autor