NUMA-architectuur begrijpen

Understanding Numa Architecture



Het ontwerpen van computers is altijd een compromis. De vier basiscomponenten van een computer - de centrale verwerkingseenheid (CPU) of processor, het geheugen, de opslag en het bord voor het aansluiten van de componenten (I/O-bussysteem) - worden zo slim mogelijk gecombineerd om een ​​machine te creëren die is zowel kosteneffectief als krachtig. Het ontwerpproces omvat meestal een optimalisatie naar processors (co-processors, multi-core setup), geheugentype en -hoeveelheid, opslag (schijven, bestandssysteem), evenals prijs. Het idee achter co-processors en multi-core architectuur is om bewerkingen te distribueren naar zoveel mogelijk afzonderlijke rekeneenheden in de kleinst mogelijke ruimte en om parallelle uitvoering van rekeninstructies meer beschikbaar en betaalbaar te maken. In termen van geheugen is het een kwestie van de hoeveelheid of grootte die door de individuele rekeneenheid kan worden aangesproken, en welk geheugentype werkt met de laagst mogelijke latency. Opslag behoort tot het externe geheugen en de prestaties zijn afhankelijk van het schijftype, het bestandssysteem dat in gebruik is, threading, overdrachtsprotocol, communicatiestructuur en het aantal aangesloten geheugenapparaten.

Het ontwerp van I/O-bussen vertegenwoordigt de computerslagaders en bepaalt in belangrijke mate hoeveel en hoe snel gegevens kunnen worden uitgewisseld tussen de hierboven genoemde afzonderlijke componenten. De topcategorie wordt geleid door componenten die worden gebruikt op het gebied van High Performance Computing (HPC). Vanaf medio 2020 zijn onder de hedendaagse vertegenwoordigers van HPC Nvidia Tesla en DGX, Radeon Instinct en Intel Xeon Phi GPU-gebaseerde acceleratorproducten (zie [1,2] voor productvergelijkingen).







NUMA . begrijpen

Non-Uniform Memory Access (NUMA) beschrijft een gedeelde geheugenarchitectuur die wordt gebruikt in hedendaagse multiprocessing-systemen. NUMA is een computersysteem dat is samengesteld uit meerdere afzonderlijke knooppunten op een zodanige manier dat het totale geheugen wordt gedeeld tussen alle knooppunten: elke CPU krijgt zijn eigen lokale geheugen toegewezen en heeft toegang tot geheugen van andere CPU's in het systeem [12,7].



NUMA is een slim systeem dat wordt gebruikt om meerdere centrale verwerkingseenheden (CPU's) aan te sluiten op elke hoeveelheid computergeheugen die op de computer beschikbaar is. De enkele NUMA-knooppunten zijn verbonden via een schaalbaar netwerk (I/O-bus) zodat een CPU systematisch toegang kan krijgen tot geheugen dat is gekoppeld aan andere NUMA-knooppunten.



Lokaal geheugen is het geheugen dat de CPU in een bepaald NUMA-knooppunt gebruikt. Vreemd of extern geheugen is het geheugen dat een CPU van een ander NUMA-knooppunt haalt. De term NUMA-ratio beschrijft de verhouding tussen de kosten van toegang tot vreemd geheugen en de kosten van toegang tot lokaal geheugen. Hoe groter de verhouding, hoe hoger de kosten, en dus hoe langer het duurt om toegang te krijgen tot het geheugen.





Het duurt echter langer dan wanneer die CPU zijn eigen lokale geheugen gebruikt. Lokale geheugentoegang is een groot voordeel, omdat het een lage latentie combineert met een hoge bandbreedte. Daarentegen heeft toegang tot geheugen van een andere CPU een hogere latentie en lagere bandbreedteprestaties.

Terugkijkend: evolutie van multiprocessors met gedeeld geheugen

Frank Dennemann [8] stelt dat moderne systeemarchitecturen geen echte Uniform Memory Access (UMA) toelaten, ook al zijn deze systemen specifiek voor dat doel ontworpen. Simpel gezegd, het idee van parallel computing was om een ​​groep processors te hebben die samenwerken om een ​​bepaalde taak te berekenen, waardoor een anders klassieke sequentiële berekening wordt versneld.



Zoals uitgelegd door Frank Dennemann [8], werd in het begin van de jaren zeventig de behoefte aan systemen die meerdere gelijktijdige gebruikersbewerkingen en overmatige gegevensgeneratie konden ondersteunen, mainstream met de introductie van relationele databasesystemen. Ondanks de indrukwekkende snelheid van uniprocessor-prestaties, waren multiprocessor-systemen beter uitgerust om deze werklast aan te kunnen. Om een ​​kosteneffectief systeem te bieden, werd de gedeelde geheugenadresruimte de focus van onderzoek. In het begin werd er gepleit voor systemen die een crossbar-switch gebruikten, maar met deze ontwerpcomplexiteit nam de complexiteit toe met de toename van processors, wat het busgebaseerde systeem aantrekkelijker maakte. Processoren in een bussysteem [kunnen] toegang krijgen tot de volledige geheugenruimte door verzoeken op de bus te verzenden, een zeer kosteneffectieve manier om het beschikbare geheugen zo optimaal mogelijk te gebruiken.

Busgebaseerde computersystemen hebben echter een knelpunt: de beperkte hoeveelheid bandbreedte die leidt tot schaalbaarheidsproblemen. Hoe meer CPU's er aan het systeem worden toegevoegd, hoe minder bandbreedte per node beschikbaar is. Bovendien, hoe meer CPU's er worden toegevoegd, hoe langer de bus en hoe hoger de latentie als resultaat.

De meeste CPU's zijn gebouwd in een tweedimensionaal vlak. Aan CPU's moesten ook geïntegreerde geheugencontrollers worden toegevoegd. De eenvoudige oplossing om vier geheugenbussen (boven, onder, links, rechts) naar elke CPU-kern te hebben, maakte de volledige beschikbare bandbreedte mogelijk, maar dat gaat alleen zo ver. CPU's stagneerden geruime tijd met vier cores. Door sporen boven en onder toe te voegen, konden directe bussen naar de diagonaal tegenover elkaar liggende CPU's worden geleid terwijl chips 3D werden. Het plaatsen van een vieraderige CPU op een kaart, die vervolgens op een bus werd aangesloten, was de volgende logische stap.

Tegenwoordig bevat elke processor veel kernen met een gedeelde on-chip cache en een off-chip geheugen en heeft hij variabele geheugentoegangskosten over verschillende delen van het geheugen binnen een server.

Het verbeteren van de efficiëntie van gegevenstoegang is een van de belangrijkste doelen van het hedendaagse CPU-ontwerp. Elke CPU-kern was voorzien van een kleine niveau één cache (32 KB) en een grotere (256 KB) niveau 2 cache. De verschillende kernen zouden later een niveau 3-cache van enkele MB delen, waarvan de omvang in de loop van de tijd aanzienlijk is gegroeid.

Om cachemissers te voorkomen - het opvragen van gegevens die niet in de cache staan ​​- wordt veel onderzoekstijd besteed aan het vinden van het juiste aantal CPU-caches, cachingstructuren en bijbehorende algoritmen. Zie [8] voor een meer gedetailleerde uitleg van het protocol voor caching snoop [4] en cachecoherentie [3,5], evenals de ontwerpideeën achter NUMA.

Software-ondersteuning voor NUMA

Er zijn twee software-optimalisatiemaatregelen die de prestaties kunnen verbeteren van een systeem dat NUMA-architectuur ondersteunt: processoraffiniteit en gegevensplaatsing. Zoals uitgelegd in [19], maakt processoraffiniteit [...] het mogelijk om een ​​proces of een thread aan een enkele CPU of een reeks CPU's te binden en te ontbinden, zodat het proces of de thread alleen op de aangewezen CPU of CPU's wordt uitgevoerd in plaats van elke CPU. De term dataplaatsing verwijst naar softwareaanpassingen waarbij code en gegevens zo dicht mogelijk in het geheugen worden bewaard.

De verschillende UNIX- en UNIX-gerelateerde besturingssystemen ondersteunen NUMA op de volgende manieren (de onderstaande lijst is overgenomen uit [14]):

  • Silicon Graphics IRIX-ondersteuning voor ccNUMA-architectuur via 1240 CPU met Origin-serverserie.
  • Microsoft Windows 7 en Windows Server 2008 R2 hebben ondersteuning toegevoegd voor NUMA-architectuur via 64 logische kernen.
  • Versie 2.5 van de Linux-kernel bevatte al basis NUMA-ondersteuning, die verder werd verbeterd in latere kernel-releases. Versie 3.8 van de Linux-kernel bracht een nieuwe NUMA-basis die de ontwikkeling mogelijk maakte van een efficiënter NUMA-beleid in latere kernel-releases [13]. Versie 3.13 van de Linux-kernel bracht tal van beleidsregels met zich mee die erop gericht zijn een proces dichtbij zijn geheugen te plaatsen, samen met het afhandelen van zaken, zoals het delen van geheugenpagina's tussen processen of het gebruik van transparante grote pagina's; nieuwe systeembesturingsinstellingen maken het mogelijk om NUMA-balancering in of uit te schakelen, evenals de configuratie van verschillende NUMA-geheugenbalanceringsparameters [15].
  • Zowel Oracle als OpenSolaris modelleren NUMA-architectuur met de introductie van logische groepen.
  • FreeBSD heeft de initiële NUMA-affiniteit en beleidsconfiguratie toegevoegd in versie 11.0.

In het boek Computer Science and Technology, Proceedings of the International Conference (CST2016) suggereert Ning Cai dat de studie van NUMA-architectuur voornamelijk was gericht op de high-end computeromgeving en stelde NUMA-aware Radix Partitioning (NaRP) voor, die de prestaties optimaliseert van gedeelde caches in NUMA-knooppunten om business intelligence-toepassingen te versnellen. Als zodanig vertegenwoordigt NUMA een middenweg tussen systemen met gedeeld geheugen (SMP) met een paar processors [6].

NUMA en Linux

Zoals hierboven vermeld, ondersteunt de Linux-kernel NUMA sinds versie 2.5. Zowel Debian GNU/Linux als Ubuntu bieden NUMA-ondersteuning voor procesoptimalisatie met de twee softwarepakketten numactl [16] en numad [17]. Met behulp van het numactl-commando kunt u de inventaris van beschikbare NUMA-knooppunten in uw systeem weergeven [18]:

# numactl --hardware
beschikbaar:2knooppunten(0-1)
knooppunt0processor:0 1 2 3 4 5 6 7 16 17 18 19 twintig eenentwintig 22 2. 3
knooppunt0maat:8157MB
knooppunt0vrij:88MB
knooppunt1processor:8 9 10 elf 12 13 14 vijftien 24 25 26 27 28 29 30 31
knooppunt1maat:8191MB
knooppunt1vrij:5176MB
knoop afstanden:
knooppunt0 1
0:10 twintig
1:twintig 10

NumaTop is een handige tool ontwikkeld door Intel voor het bewaken van de locatie van het runtime-geheugen en het analyseren van processen in NUMA-systemen [10,11]. De tool kan potentiële NUMA-gerelateerde prestatieknelpunten identificeren en zo helpen om de geheugen/CPU-toewijzingen opnieuw in evenwicht te brengen om het potentieel van een NUMA-systeem te maximaliseren. Zie [9] voor een meer gedetailleerde beschrijving.

Gebruiksscenario's

Computers die NUMA-technologie ondersteunen, zorgen ervoor dat alle CPU's rechtstreeks toegang hebben tot het volledige geheugen - de CPU's zien dit als een enkele, lineaire adresruimte. Dit leidt tot een efficiënter gebruik van het 64-bits adresseringsschema, wat resulteert in een snellere verplaatsing van gegevens, minder replicatie van gegevens en eenvoudiger programmeren.

NUMA-systemen zijn behoorlijk aantrekkelijk voor server-side toepassingen, zoals datamining en beslissingsondersteunende systemen. Bovendien wordt het schrijven van applicaties voor gaming en high-performance software veel gemakkelijker met deze architectuur.

Conclusie

Kortom, NUMA-architectuur richt zich op schaalbaarheid, wat een van de belangrijkste voordelen is. In een NUMA-CPU heeft één knooppunt een hogere bandbreedte of lagere latentie om toegang te krijgen tot het geheugen op datzelfde knooppunt (de lokale CPU vraagt ​​bijvoorbeeld tegelijkertijd om toegang tot het geheugen als de externe toegang; de prioriteit ligt bij de lokale CPU). Dit zal de geheugendoorvoer aanzienlijk verbeteren als de gegevens worden gelokaliseerd op specifieke processen (en dus processors). De nadelen zijn de hogere kosten van het verplaatsen van gegevens van de ene processor naar de andere. Zolang dit niet te vaak voorkomt, zal een NUMA-systeem beter presteren dan systemen met een meer traditionele architectuur.

Links en referenties

  1. Vergelijk NVIDIA Tesla met Radeon Instinct, https://www.itcentralstation.com/products/comparisons/nvidia-tesla_vs_radeon-instinct
  2. Vergelijk NVIDIA DGX-1 met Radeon Instinct, https://www.itcentralstation.com/products/comparisons/nvidia-dgx-1_vs_radeon-instinct
  3. Cachecoherentie, Wikipedia, https://en.wikipedia.org/wiki/Cache_coherence
  4. Bussnuffelen, Wikipedia, https://en.wikipedia.org/wiki/Bus_snooping
  5. Cachecoherentieprotocollen in multiprocessorsystemen, Geeks voor geeks, https://www.geeksforgeeks.org/cache-coherence-protocols-in-multiprocessor-system /
  6. Informatica en technologie – Proceedings of the International Conference (CST2016), Ning Cai (Ed.), World Scientific Publishing Co Pte Ltd, ISBN: 9789813146419
  7. Daniel P. Bovet en Marco Cesati: NUMA-architectuur begrijpen in de Linux-kernel begrijpen, 3e editie, O'Reilly, https://www.oreilly.com/library/view/understanding-the-linux/0596005652/
  8. Frank Dennemann: NUMA Deep Dive deel 1: Van UMA naar NUMA, https://frankdenneman.nl/2016/07/07/numa-deep-dive-part-1-uma-numa/
  9. Colin Ian King: NumaTop: een NUMA-systeembewakingstool, http://smackerelofopinion.blogspot.com/2015/09/numatop-numa-system-monitoring-tool.html
  10. Numatop, https://github.com/intel/numatop
  11. Pakket numatop voor Debian GNU / Linux, https://packages.debian.org/buster/numatop
  12. Jonathan Kehayias: Inzicht in niet-uniforme geheugentoegang/architecturen (NUMA), https://www.sqlskills.com/blogs/jonathan/understanding-non-uniform-memory-accessarchitectures-numa/
  13. Linux Kernel Nieuws voor Kernel 3.8, https://kernelnewbies.org/Linux_3.8
  14. Niet-uniforme geheugentoegang (NUMA), Wikipedia, https://en.wikipedia.org/wiki/Non-uniform_memory_access
  15. Documentatie voor Linux-geheugenbeheer, NUMA, https://www.kernel.org/doc/html/latest/vm/numa.html
  16. Pakket numactl voor Debian GNU/Linux, https://packages.debian.org/sid/admin/numactl
  17. Pakket numad voor Debian GNU/Linux, https://packages.debian.org/buster/numad
  18. Hoe kom ik erachter of de NUMA-configuratie is ingeschakeld of uitgeschakeld?, https://www.thegeekdiary.com/centos-rhel-how-to-find-if-numa-configuration-is-enabled-or-disabled/
  19. Processor affiniteit, Wikipedia, https://en.wikipedia.org/wiki/Processor_affinity

Bedankt

De auteurs willen Gerold Rupprecht bedanken voor zijn steun bij het opstellen van dit artikel.

Over de Auteurs

Plaxedes Nehanda is een veelzijdige, zelfgestuurde veelzijdige persoon die veel hoeden draagt, waaronder een evenementenplanner, een virtuele assistent, een transcribent en een fervent onderzoeker, gevestigd in Johannesburg, Zuid-Afrika.

Prins K. Nehanda is ingenieur instrumentatie en controle (metrologie) bij Paeflow Metering in Harare, Zimbabwe.

Frank Hofmann werkt onderweg – bij voorkeur vanuit Berlijn (Duitsland), Genève (Zwitserland) en Kaapstad (Zuid-Afrika) – als ontwikkelaar, trainer en auteur voor tijdschriften als Linux-User en Linux Magazine. Hij is ook de co-auteur van het Debian-boek voor pakketbeheer ( http://www.dpmb.org ).