Grundlegendes zur NUMA-Architektur

Understanding Numa Architecture



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 zugleich. Der Designprozess beinhaltet hauptsächlich eine Optimierung in Bezug auf Prozessoren (Co-Prozessoren, Multi-Core-Setup), Speichertyp und -größe, Speicherplatz (Festplatten, Dateisystem) sowie Preis. Die Idee hinter Co-Prozessoren und Multi-Core-Architektur ist 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 Plattentyp, 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. Angeführt wird die Spitzenkategorie von Komponenten, die im Bereich High Performance Computing (HPC) eingesetzt werden. 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 gemeinsam genutzte Speicherarchitektur, die in zeitgenössischen Multiprozessorsystemen verwendet wird. NUMA ist ein Rechensystem, das aus mehreren einzelnen Knoten besteht, sodass der Gesamtspeicher von allen Knoten gemeinsam genutzt wird: Jeder CPU wird ein 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 des auf dem Computer verfügbaren Computerspeichers zu verbinden. Die einzelnen NUMA-Knoten sind über ein skalierbares Netzwerk (I/O-Bus) verbunden, so dass eine CPU systematisch auf Speicher zugreifen kann, der anderen NUMA-Knoten zugeordnet 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, war die Idee des parallelen Rechnens, 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] erläutert, 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 kosteneffektives System bereitzustellen, wurde der Adressraum mit gemeinsam genutztem Speicher 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 möglichst optimal 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 steht zur Verfügung. 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 außerdem über integrierte Speichercontroller verfügen. Die einfache Lösung von vier Speicherbussen (oben, unten, links, rechts) zu jedem CPU-Kern ermöglichte die volle verfügbare Bandbreite, aber das geht nur so weit. CPUs stagnierten bei vier Kernen längere Zeit. Das Hinzufügen von Spuren oben und unten ermöglichte direkte Busse zu den diagonal gegenüberliegenden CPUs, während 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.

Heutzutage 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 war 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 die Prozessoraffinität […] das Binden und Aufheben der Bindung eines Prozesses oder Threads an eine einzelne CPU oder an eine Reihe von CPUs, sodass der Prozess oder Thread nur auf der angegebenen CPU oder CPUs ausgeführt wird und nicht 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]):

  • Silicon Graphics IRIX-Unterstützung für ccNUMA-Architektur über 1240 CPU mit Origin-Serverserie.
  • Microsoft Windows 7 und Windows Server 2008 R2 haben die NUMA-Architektur über 64 logische Kerne unterstützt.
  • Version 2.5 des Linux-Kernels enthielt bereits grundlegende NUMA-Unterstützung, die in nachfolgenden Kernel-Releases weiter verbessert wurde. Version 3.8 des Linux-Kernels brachte eine neue NUMA-Grundlage, die die Entwicklung effizienterer NUMA-Richtlinien in späteren Kernel-Releases ermöglichte [13]. Version 3.13 des Linux-Kernels brachte zahlreiche Richtlinien mit sich, die darauf abzielen, einen Prozess in die Nähe seines Speichers zu bringen, zusammen mit der Behandlung von Fällen, wie z. B. die gemeinsame Nutzung von Speicherseiten zwischen Prozessen oder die Verwendung von transparenten riesigen Seiten; neue Systemsteuerungseinstellungen ermöglichen das Aktivieren oder Deaktivieren des NUMA-Ausgleichs sowie die Konfiguration verschiedener NUMA-Speicherausgleichsparameter [15].
  • Sowohl Oracle als auch OpenSolaris modellieren die NUMA-Architektur mit der Einführung logischer Gruppen.
  • FreeBSD hat die anfängliche NUMA-Affinitäts- und Richtlinienkonfiguration in Version 11.0 hinzugefügt.

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 die Leistung optimiert. von gemeinsam genutzten Caches in NUMA-Knoten, um Business-Intelligence-Anwendungen zu beschleunigen. 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 mit den beiden Softwarepaketen numactl [16] und numad [17] NUMA-Unterstützung zur Prozessoptimierung. Mit Hilfe des numactl-Befehls können Sie den Bestand der verfügbaren NUMA-Knoten in Ihrem System auflisten [18]:

# numactl --hardware
erhältlich:2Knoten(0-1)
Knoten0CPU:0 1 2 3 4 5 6 7 16 17 18 19 zwanzig einundzwanzig 22 2. 3
Knoten0Größe:8157MB
Knoten0kostenlos:88MB
Knoten1CPU:8 9 10 elf 12 13 14 fünfzehn 24 25 26 27 28 29 30 31
Knoten1Größe:8191MB
Knoten1kostenlos:5176MB
Knotenabstände:
Knoten0 1
0:10 zwanzig
1:zwanzig 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, einer geringeren Replikation von Daten und einer einfacheren Programmierung führt.

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

Abschluss

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 Latenzzeit, um auf den Speicher desselben Knotens zuzugreifen (z. B. fordert die lokale CPU gleichzeitig mit dem Fernzugriff Speicherzugriff an; die Priorität liegt bei der lokalen CPU). Dies wird den Speicherdurchsatz dramatisch verbessern, wenn die Daten auf bestimmte Prozesse (und damit Prozessoren) lokalisiert werden. 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.itcentralstation.com/products/comparisons/nvidia-tesla_vs_radeon-instinct
  2. Vergleichen Sie NVIDIA DGX-1 mit Radeon Instinct, https://www.itcentralstation.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-coherence-protocols-in-multiprocessor-system /
  6. Informatik und Technologie – Proceedings of the International Conference (CST2016), Ning Cai (Hrsg.), 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://smackerelofopinion.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: Verständnis von uneinheitlichem Speicherzugriff/Architekturen (NUMA), https://www.sqlskills.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. Wie finde ich 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 schön

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.

Prince 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 ).