NUMA

Grundlegendes zur NUMA-Architektur

Grundlegendes zur NUMA-Architektur
Computer zu entwerfen ist immer ein Kompromiss. Die vier Grundkomponenten eines Computers – die Zentraleinheit (CPU) bzw. der Prozessor, der Arbeitsspeicher, der Speicher und die Platine zum Anschluss der Komponenten (I/O-Bussystem) – werden so geschickt wie möglich zu einer Maschine kombiniert, die ist kostengünstig und leistungsstark. Der Designprozess beinhaltet meist eine Optimierung in Bezug auf Prozessoren (Co-Prozessoren, Multi-Core-Setup), Speichertyp und -menge, Speicher (Festplatten, Dateisystem) sowie Preis.Die Idee von Co-Prozessoren und Multi-Core-Architektur ist es, Operationen auf möglichst viele einzelne Recheneinheiten auf kleinstem Raum zu verteilen und die parallele Ausführung von Rechenanweisungen verfügbarer und erschwinglicher zu machen. Beim Speicher ist es eine Frage der Menge bzw. Größe, die von der einzelnen Recheneinheit angesprochen werden kann und welcher Speichertyp mit möglichst geringer Latenz arbeitet. Der Speicher gehört zum externen Speicher, und seine Leistung hängt vom Festplattentyp, dem verwendeten Dateisystem, dem Threading, dem Übertragungsprotokoll, der Kommunikationsstruktur und der Anzahl der angeschlossenen Speichergeräte ab.

Das Design von I/O-Bussen stellt die Arterien des Computers dar und bestimmt maßgeblich, wie viel und wie schnell Daten zwischen den oben aufgeführten Einzelkomponenten ausgetauscht werden können. Die Spitzenkategorie wird von Komponenten aus dem Bereich High Performance Computing (HPC) angeführt. Zu den aktuellen Vertretern von HPC gehören ab Mitte 2020 Nvidia Tesla und DGX, Radeon Instinct und Intel Xeon Phi GPU-basierte Beschleunigerprodukte (siehe [1,2] für Produktvergleiche).

NUMA verstehen

Non-Uniform Memory Access (NUMA) beschreibt eine Shared-Memory-Architektur, die in modernen Multiprozessorsystemen verwendet wird. NUMA ist ein Computersystem, das aus mehreren einzelnen Knoten besteht, sodass der Gesamtspeicher von allen Knoten gemeinsam genutzt wird: „jeder CPU wird ihr eigener lokaler Speicher zugewiesen und kann auf den Speicher anderer CPUs im System zugreifen“ [12,7].

NUMA ist ein cleveres System, das verwendet wird, um mehrere Zentraleinheiten (CPU) mit einer beliebigen Menge an Computerspeicher zu verbinden, die auf dem Computer verfügbar ist. Die einzelnen NUMA-Knoten sind über ein skalierbares Netzwerk (I/O-Bus) verbunden, sodass eine CPU systematisch auf den Speicher zugreifen kann, der mit anderen NUMA-Knoten verknüpft ist.

Lokaler Speicher ist der Speicher, den die CPU in einem bestimmten NUMA-Knoten verwendet. Fremd- oder Remote-Speicher ist der Speicher, den eine CPU von einem anderen NUMA-Knoten nimmt. Der Begriff NUMA-Verhältnis beschreibt das Verhältnis der Kosten für den Zugriff auf fremden Speicher zu den Kosten für den Zugriff auf den lokalen Speicher. Je größer das Verhältnis, desto höher die Kosten und desto länger dauert der Zugriff auf den Speicher.

Es dauert jedoch länger, als wenn diese CPU auf ihren eigenen lokalen Speicher zugreift. Der lokale Speicherzugriff ist ein großer Vorteil, da er geringe Latenz mit hoher Bandbreite kombiniert. Im Gegensatz dazu hat der Zugriff auf den Speicher einer anderen CPU eine höhere Latenz und eine geringere Bandbreitenleistung.

Rückblick: Evolution von Shared-Memory-Multiprozessoren

Frank Dennemann [8] stellt fest, dass moderne Systemarchitekturen keinen echten Uniform Memory Access (UMA) erlauben, obwohl diese Systeme speziell dafür ausgelegt sind. Einfach ausgedrückt bestand die Idee des parallelen Rechnens darin, eine Gruppe von Prozessoren zu haben, die zusammenarbeiten, um eine bestimmte Aufgabe zu berechnen, wodurch eine ansonsten klassische sequentielle Berechnung beschleunigt wird.

Wie Frank Dennemann [8] erklärt, wurde in den frühen 1970er Jahren mit der Einführung relationaler Datenbanksysteme „der Bedarf an Systemen, die mehrere gleichzeitige Benutzeroperationen und übermäßige Datengenerierung bedienen konnten, zum Mainstream“. „Trotz der beeindruckenden Einprozessorleistung waren Multiprozessorsysteme besser für diese Arbeitsbelastung gerüstet. Um ein kostengünstiges System bereitzustellen, wurde der Adressraum des gemeinsam genutzten Speichers in den Fokus der Forschung gerückt. Schon früh wurden Systeme befürwortet, die einen Crossbar-Switch verwenden, jedoch skalierte diese Designkomplexität mit der Zunahme der Prozessoren, was das busbasierte System attraktiver machte. Prozessoren in einem Bussystem [können] auf den gesamten Speicherplatz zugreifen, indem sie Anfragen auf dem Bus senden, eine sehr kostengünstige Möglichkeit, den verfügbaren Speicher so optimal wie möglich zu nutzen.”

Busbasierte Computersysteme haben jedoch einen Engpass – die begrenzte Bandbreite, die zu Skalierbarkeitsproblemen führt. Je mehr CPUs dem System hinzugefügt werden, desto weniger Bandbreite pro Knoten verfügbar. Je mehr CPUs hinzugefügt werden, desto länger ist der Bus und desto höher die Latenz.

Die meisten CPUs wurden in einer zweidimensionalen Ebene konstruiert. CPUs mussten auch integrierte Speichercontroller haben. Die einfache Lösung mit vier Speicherbussen (oben, unten, links, rechts) zu jedem CPU-Kern ermöglichte die volle verfügbare Bandbreite, aber das geht nur so weit so. CPUs stagnierten lange bei vier Kernen. Das Hinzufügen von Spuren oben und unten ermöglichte direkte Busse zu den diagonal gegenüberliegenden CPUs, als die Chips 3D wurden. Eine vierkernige CPU auf einer Karte zu platzieren, die dann an einen Bus angeschlossen wurde, war der nächste logische Schritt.

Heute enthält jeder Prozessor viele Kerne mit einem gemeinsamen On-Chip-Cache und einem Off-Chip-Speicher und hat variable Speicherzugriffskosten über verschiedene Teile des Speichers innerhalb eines Servers.

Die Verbesserung der Effizienz des Datenzugriffs ist eines der Hauptziele des modernen CPU-Designs. Jeder CPU-Kern wurde mit einem kleinen Level-1-Cache (32 KB) und einem größeren (256 KB) Level-2-Cache ausgestattet. Die verschiedenen Kerne würden sich später einen Level-3-Cache von mehreren MB teilen, dessen Größe im Laufe der Zeit stark angewachsen ist.

Um Cache-Misses zu vermeiden – das Anfordern von Daten, die sich nicht im Cache befinden – wird viel Recherchezeit darauf verwendet, die richtige Anzahl von CPU-Caches, Caching-Strukturen und entsprechenden Algorithmen zu finden. Siehe [8] für eine detailliertere Erläuterung des Protokolls für Caching-Snoop [4] und Cache-Kohärenz [3,5] sowie die Designideen hinter NUMA.

Software-Support für NUMA

Es gibt zwei Maßnahmen zur Softwareoptimierung, die die Leistung eines Systems verbessern können, das die NUMA-Architektur unterstützt – Prozessoraffinität und Datenplatzierung. Wie in [19] erläutert, ermöglicht „Prozessoraffinität […] als jede CPU.” Der Begriff „Datenplatzierung“ bezieht sich auf Softwareänderungen, bei denen Code und Daten so nah wie möglich im Speicher gehalten werden.

Die verschiedenen UNIX- und UNIX-bezogenen Betriebssysteme unterstützen NUMA auf folgende Weise (die folgende Liste stammt aus [14]):

In dem Buch „Computer Science and Technology, Proceedings of the International Conference (CST2016)“ schlägt Ning Cai vor, dass sich das Studium der NUMA-Architektur hauptsächlich auf die High-End-Computerumgebung konzentrierte und schlug NUMA-fähige Radix-Partitionierung (NaRP) vor, die optimiert optimize die Leistung gemeinsam genutzter Caches in NUMA-Knoten zur Beschleunigung von Business-Intelligence-Anwendungen. Als solches stellt NUMA einen Mittelweg zwischen Shared Memory (SMP)-Systemen mit wenigen Prozessoren dar [6].

NUMA und Linux

Wie oben erwähnt, unterstützt der Linux-Kernel NUMA seit Version 2.5. Sowohl Debian GNU/Linux als auch Ubuntu bieten NUMA-Unterstützung zur Prozessoptimierung mit den beiden Softwarepaketen numactl [16] und numad [17]. Mit Hilfe des numactl-Befehls können Sie den Bestand der verfügbaren NUMA-Knoten in Ihrem System auflisten [18]:

# numactl --hardware
verfügbar: 2 Knoten (0-1)
Knoten 0 CPU: 0 1 2 3 4 5 6 7 16 17 18 19 20 21 22 23
Knoten 0 Größe: 8157 MB
Knoten 0 frei: 88 MB
Knoten 1 CPU: 8 9 10 11 12 13 14 15 24 25 26 27 28 29 30 31
Knoten 1 Größe: 8191 MB
Knoten 1 frei: 5176 MB
Knotenabstände:
Knoten 0 1
0: 10 20
1: 20 10

NumaTop ist ein nützliches Tool, das von Intel entwickelt wurde, um die Speicherlokalität der Laufzeit zu überwachen und Prozesse in NUMA-Systemen zu analysieren [10,11]. Das Tool kann potenzielle NUMA-bezogene Leistungsengpässe identifizieren und somit helfen, Speicher-/CPU-Zuweisungen neu auszubalancieren, um das Potenzial eines NUMA-Systems zu maximieren. Siehe [9] für eine genauere Beschreibung.

Nutzungsszenarien

Computer, die die NUMA-Technologie unterstützen, ermöglichen allen CPUs den direkten Zugriff auf den gesamten Speicher – die CPUs sehen dies als einen einzigen, linearen Adressraum. Dies führt zu einer effizienteren Verwendung des 64-Bit-Adressierungsschemas, was zu einer schnelleren Bewegung von Daten, weniger Replikation von Daten und einer einfacheren Programmierung führt.

NUMA-Systeme sind sehr attraktiv für serverseitige Anwendungen wie Data Mining und Entscheidungsunterstützungssysteme quite. Darüber hinaus wird das Schreiben von Anwendungen für Spiele und Hochleistungssoftware mit dieser Architektur viel einfacher.

Fazit

Zusammenfassend lässt sich sagen, dass die NUMA-Architektur auf Skalierbarkeit abzielt, was einer der Hauptvorteile ist. In einer NUMA-CPU hat ein Knoten eine höhere Bandbreite oder eine geringere Latenz, um auf den Speicher desselben Knotens zuzugreifen (z.G., die lokale CPU fordert gleichzeitig mit dem Fernzugriff einen Speicherzugriff an; die Priorität liegt auf der lokalen CPU). Dies wird den Speicherdurchsatz dramatisch verbessern, wenn die Daten auf bestimmte Prozesse (und damit Prozessoren) lokalisiert sind. Die Nachteile sind die höheren Kosten für die Übertragung von Daten von einem Prozessor auf einen anderen. Solange dieser Fall nicht zu oft auftritt, wird ein NUMA-System Systeme mit einer traditionelleren Architektur übertreffen.

Links und Referenzen

  1. Vergleichen Sie NVIDIA Tesla mit. Radeon Instinct, https://www.itzentralstation.com/products/comparisons/nvidia-tesla_vs_radeon-instinct
  2. Vergleichen Sie NVIDIA DGX-1 mit. Radeon Instinct, https://www.itzentralstation.com/products/comparisons/nvidia-dgx-1_vs_radeon-instinct
  3. Cache-Kohärenz, Wikipedia, https://en.Wikipedia.org/wiki/Cache_coherence
  4. Busschnüffeln, Wikipedia, https://en.Wikipedia.org/wiki/Bus_snooping
  5. Cache-Kohärenzprotokolle in Multiprozessorsystemen, Geeks für Geeks, https://www.Geeksforgeeks.org/Cache-Kohärenz-Protokolle-in-Multiprozessor-System/
  6. Informatik und Technologie - Proceedings of the International Conference (CST2016), Ning Cai (Ed.), World Scientific Publishing Co Pte Ltd, ISBN: 9789813146419
  7. Daniel P. Bovet und Marco Cesati: Understanding NUMA architecture in Understanding the Linux Kernel, 3. Auflage, O'Reilly, https://www.oreilly.com/library/view/understanding-the-linux/0596005652/
  8. Frank Dennemann: NUMA Deep Dive Teil 1: Von UMA zu NUMA, https://frankdenneman.nl/2016/07/07/numa-deep-dive-part-1-uma-numa/
  9. Colin Ian King: NumaTop: Ein NUMA-Systemüberwachungstool, http://smackerelopinion.Blogspot.com/2015/09/numatop-numa-system-monitoring-tool.html
  10. Numatop, https://github.com/intel/numatop
  11. Paket numatop für Debian GNU/Linux, https://packages.debian.org/buster/numatop
  12. Jonathan Kehayias: Understanding Non-Uniform Memory Access/Architectures (NUMA), https://www.sqlsfähigkeiten.com/blogs/jonathan/understanding-non-uniform-memory-accessarchitectures-numa/
  13. Linux-Kernel-Neuigkeiten für Kernel 3.8, https://kernelnewbies.org/Linux_3.8
  14. Uneinheitlicher Speicherzugriff (NUMA), Wikipedia, https://en.Wikipedia.org/wiki/Non-uniform_memory_access
  15. Dokumentation zur Linux-Speicherverwaltung, NUMA, https://www.Kernel.org/doc/html/latest/vm/numa.html
  16. Paket numactl für Debian GNU/Linux, https://packages.debian.org/sid/admin/numactl
  17. Paket numad für Debian GNU/Linux, https://packages.debian.org/buster/numad
  18. So finden Sie heraus, ob die NUMA-Konfiguration aktiviert oder deaktiviert ist?, https://www.thegeekdiary.com/centos-rhel-how-to-find-if-numa-configuration-is-enabled-or-disabled/
  19. Prozessoraffinität, Wikipedia, https://en.Wikipedia.org/wiki/Processor_affinity

Danke

Die Autoren danken Gerold Rupprecht für seine Unterstützung bei der Erstellung dieses Artikels.

Über die Autoren

Plaxedes Nehanda ist eine vielseitige, selbstgesteuerte, vielseitige Person, die viele Hüte trägt, darunter ein Veranstaltungsplaner, eine virtuelle Assistentin, eine Transkribiererin sowie eine begeisterte Forscherin mit Sitz in Johannesburg, Südafrika.

Prinz K. Nehanda ist Instrumentation and Control (Metrology) Engineer bei Paeflow Metering in Harare, Simbabwe.

Frank Hofmann ist unterwegs - vorzugsweise aus Berlin (Deutschland), Genf (Schweiz) und Kapstadt (Südafrika) - als Entwickler, Trainer und Autor für Magazine wie Linux-User und Linux Magazine. Er ist auch Co-Autor des Debian-Paketverwaltungsbuchs (http://www.dpmb.org).

Top 10 Spiele zum Spielen auf Ubuntu
Die Windows-Plattform war eine der dominierenden Plattformen für Spiele aufgrund des großen Prozentsatzes von Spielen, die heute entwickelt werden, um...
Die 5 besten Arcade-Spiele für Linux
Heutzutage sind Computer ernsthafte Maschinen, die zum Spielen verwendet werden. Wenn du den neuen Highscore nicht bekommst, weißt du was ich meine. I...
Schlacht um Wesnoth 1.13.6 Entwicklung veröffentlicht
Schlacht um Wesnoth 1.13.6, das letzten Monat veröffentlicht wurde, ist die sechste Entwicklungsversion im 1.13.x-Serie und bietet eine Reihe von Verb...