Zrozumienie architektury NUMA

Understanding Numa Architecture



Projektowanie komputerów to zawsze kompromis. Cztery podstawowe komponenty komputera – jednostka centralna (CPU) lub procesor, pamięć, pamięć masowa i płyta do podłączenia komponentów (system magistrali I/O) – są połączone tak sprytnie, jak to możliwe, aby stworzyć maszynę, która jest zarówno opłacalny, jak i wydajny. Proces projektowania obejmuje głównie optymalizację pod kątem procesorów (koprocesory, konfiguracja wielordzeniowa), typu i ilości pamięci, pamięci (dyski, system plików), a także ceny. Ideą koprocesorów i architektury wielordzeniowej jest do dystrybucji operacji do jak największej liczby pojedynczych jednostek obliczeniowych na możliwie najmniejszej przestrzeni oraz do uczynienia równoległego wykonywania instrukcji obliczeniowych bardziej dostępnym i przystępnym cenowo. Jeśli chodzi o pamięć, jest to kwestia ilości lub rozmiaru, którym może zajmować się pojedyncza jednostka obliczeniowa oraz jaki typ pamięci działa z najmniejszym możliwym opóźnieniem. Pamięć masowa należy do pamięci zewnętrznej, a jej wydajność zależy od typu dysku, używanego systemu plików, wątków, protokołu transferu, struktury komunikacyjnej i liczby podłączonych urządzeń pamięci.

Konstrukcja magistral I/O reprezentuje arterie komputerowe i znacząco determinuje, jak dużo i jak szybko dane mogą być wymieniane pomiędzy poszczególnymi komponentami wymienionymi powyżej. Najwyższą kategorię wiodą komponenty stosowane w dziedzinie obliczeń o wysokiej wydajności (HPC). Od połowy 2020 r. wśród współczesnych przedstawicieli HPC znajdują się Nvidia Tesla i DGX, Radeon Instinct oraz akceleratory oparte na procesorach graficznych Intel Xeon Phi (porównania produktów patrz [1,2]).







Zrozumienie NUMA

Non-Uniform Memory Access (NUMA) opisuje architekturę pamięci współdzielonej stosowaną we współczesnych systemach wieloprocesorowych. NUMA to system obliczeniowy złożony z kilku pojedynczych węzłów w taki sposób, że zagregowana pamięć jest współdzielona między wszystkie węzły: każdy procesor ma przypisaną własną pamięć lokalną i może uzyskać dostęp do pamięci z innych procesorów w systemie [12,7].



NUMA to sprytny system służący do łączenia wielu jednostek centralnych (CPU) z dowolną ilością pamięci komputera dostępnej w komputerze. Pojedyncze węzły NUMA są połączone przez skalowalną sieć (magistrala we/wy), dzięki czemu procesor może systematycznie uzyskiwać dostęp do pamięci powiązanej z innymi węzłami NUMA.



Pamięć lokalna to pamięć używana przez procesor w określonym węźle NUMA. Pamięć obca lub zdalna to pamięć, którą procesor pobiera z innego węzła NUMA. Termin NUMA ratio opisuje stosunek kosztu dostępu do pamięci obcej do kosztu dostępu do pamięci lokalnej. Im wyższy współczynnik, tym wyższy koszt, a co za tym idzie, dłużej trwa dostęp do pamięci.





Jednak trwa to dłużej niż wtedy, gdy procesor uzyskuje dostęp do własnej pamięci lokalnej. Dostęp do pamięci lokalnej jest główną zaletą, ponieważ łączy niskie opóźnienia z dużą przepustowością. W przeciwieństwie do tego, dostęp do pamięci należącej do dowolnego innego procesora ma większe opóźnienia i niższą wydajność przepustowości.

Patrząc wstecz: ewolucja multiprocesorów z pamięcią współdzieloną

Frank Dennemann [8] stwierdza, że ​​nowoczesne architektury systemów nie pozwalają na prawdziwie jednolitego dostępu do pamięci (UMA), mimo że systemy te są specjalnie zaprojektowane do tego celu. Mówiąc najprościej, idea obliczeń równoległych polegała na tym, aby grupa procesorów współpracowała przy obliczaniu danego zadania, przyspieszając w ten sposób klasyczne obliczenia sekwencyjne.



Jak wyjaśnił Frank Dennemann [8], we wczesnych latach 70-tych wraz z wprowadzeniem relacyjnych baz danych do głównego nurtu stało się zapotrzebowanie na systemy, które mogłyby obsługiwać wiele równoczesnych operacji użytkowników i nadmierne generowanie danych. Pomimo imponującej wydajności jednoprocesorowej, systemy wieloprocesorowe były lepiej przygotowane do obsługi tego obciążenia. Aby zapewnić opłacalny system, przedmiotem badań stała się przestrzeń adresowa pamięci współdzielonej. Na początku zalecano systemy wykorzystujące przełącznik krzyżowy, jednak złożoność projektu zwiększała się wraz ze wzrostem liczby procesorów, co czyniło system oparty na magistrali bardziej atrakcyjnym. Procesory w systemie magistrali [mogą] uzyskać dostęp do całej przestrzeni pamięci poprzez wysyłanie żądań do magistrali, co jest bardzo opłacalnym sposobem optymalnego wykorzystania dostępnej pamięci.

Jednak systemy komputerowe oparte na magistrali mają wąskie gardło — ograniczoną przepustowość, która prowadzi do problemów ze skalowalnością. Im więcej procesorów zostanie dodanych do systemu, tym mniejsza dostępna przepustowość na węzeł. Co więcej, im więcej dodanych procesorów, tym dłuższa magistrala i tym większe opóźnienie.

Większość procesorów została skonstruowana w płaszczyźnie dwuwymiarowej. Procesory musiały również mieć dodane zintegrowane kontrolery pamięci. Proste rozwiązanie polegające na posiadaniu czterech magistral pamięci (góra, dół, lewo, prawo) dla każdego rdzenia procesora zapewniało pełną dostępną przepustowość, ale to tylko do tej pory. Procesory przez długi czas pozostawały w stagnacji z czterema rdzeniami. Dodanie śladów powyżej i poniżej umożliwiło bezpośrednie połączenie autobusów z przeciwległymi po przekątnej procesorami, gdy układy stały się trójwymiarowe. Kolejnym logicznym krokiem było umieszczenie czterordzeniowego procesora na karcie, która następnie została podłączona do magistrali.

Obecnie każdy procesor zawiera wiele rdzeni ze współużytkowaną pamięcią podręczną na chipie i pamięcią poza chipem, a także ma zmienne koszty dostępu do pamięci w różnych częściach pamięci w serwerze.

Poprawa wydajności dostępu do danych jest jednym z głównych celów współczesnego projektowania procesorów. Każdy rdzeń procesora był wyposażony w małą pamięć podręczną pierwszego poziomu (32 KB) i większą (256 KB) pamięć podręczną drugiego poziomu. Różne rdzenie będą później współużytkować pamięć podręczną poziomu 3 o wielkości kilku MB, której rozmiar z czasem znacznie się zwiększył.

Aby uniknąć chybień w pamięci podręcznej — żądania danych, których nie ma w pamięci podręcznej — dużo czasu poświęca się na znalezienie odpowiedniej liczby pamięci podręcznych procesora, struktur pamięci podręcznej i odpowiednich algorytmów. Zobacz [8], aby uzyskać bardziej szczegółowe wyjaśnienie protokołu buforowania snoop [4] i spójności pamięci podręcznej [3,5], a także pomysły projektowe stojące za NUMA.

Wsparcie oprogramowania dla NUMA

Istnieją dwa sposoby optymalizacji oprogramowania, które mogą poprawić wydajność systemu obsługującego architekturę NUMA — koligacja procesora i rozmieszczenie danych. Jak wyjaśniono w [19], powinowactwo procesora […] umożliwia wiązanie i usuwanie powiązania procesu lub wątku z pojedynczym procesorem lub zakresem procesorów, dzięki czemu proces lub wątek będzie wykonywany tylko na wyznaczonym procesorze lub procesorach, a nie dowolny procesor. Termin umieszczanie danych odnosi się do modyfikacji oprogramowania, w których kod i dane są przechowywane jak najbliżej pamięci.

Różne systemy operacyjne związane z UNIX i UNIX obsługują NUMA w następujący sposób (poniższa lista pochodzi z [14]):

  • Obsługa Silicon Graphics IRIX dla architektury ccNUMA powyżej 1240 procesorów z serią serwerów Origin.
  • Microsoft Windows 7 i Windows Server 2008 R2 dodały obsługę architektury NUMA na 64 rdzeniach logicznych.
  • Wersja 2.5 jądra Linux zawierała już podstawową obsługę NUMA, która została dodatkowo ulepszona w kolejnych wydaniach jądra. Wersja 3.8 jądra Linux przyniosła nową podstawę NUMA, która pozwoliła na rozwój wydajniejszych polityk NUMA w późniejszych wydaniach jądra [13]. Wersja 3.13 jądra Linuksa wprowadziła wiele zasad, które mają na celu umieszczenie procesu w pobliżu jego pamięci, wraz z obsługą przypadków, takich jak udostępnianie stron pamięci między procesami lub użycie przezroczystych dużych stron; nowe ustawienia sterowania systemem umożliwiają włączanie i wyłączanie równoważenia pamięci NUMA, a także konfigurację różnych parametrów równoważenia pamięci NUMA [15].
  • Zarówno Oracle, jak i OpenSolaris modelują architekturę NUMA z wprowadzeniem grup logicznych.
  • FreeBSD dodał początkową konfigurację koligacji i polityki NUMA w wersji 11.0.

W książce Computer Science and Technology, Proceedings of the International Conference (CST2016) Ning Cai sugeruje, że badania nad architekturą NUMA koncentrowały się głównie na środowisku obliczeniowym wysokiej klasy i zaproponowały partycjonowanie Radix (NaRP), które optymalizuje wydajność współużytkowanych pamięci podręcznych w węzłach NUMA w celu przyspieszenia aplikacji Business Intelligence. Jako taka, NUMA reprezentuje pośrednie miejsce między systemami pamięci współdzielonej (SMP) z kilkoma procesorami [6].

NUMA i Linux

Jak wspomniano powyżej, jądro Linux obsługuje NUMA od wersji 2.5. Zarówno Debian GNU/Linux, jak i Ubuntu oferują obsługę NUMA do optymalizacji procesów za pomocą dwóch pakietów oprogramowania numactl [16] i numad [17]. Za pomocą polecenia numactl możesz wyświetlić spis dostępnych węzłów NUMA w Twoim systemie [18]:

# numactl -- sprzęt
do dyspozycji:2węzły(0-1)
węzeł0procesor:0 1 2 3 4 5 6 7 16 17 18 19 20 dwadzieścia jeden 22 2. 3
węzeł0rozmiar:8157MB
węzeł0darmowy:88MB
węzeł1procesor:8 9 10 jedenaście 12 13 14 piętnaście 24 25 26 27 28 29 30 31
węzeł1rozmiar:8191MB
węzeł1darmowy:5176MB
odległości węzłów:
węzeł0 1
0:10 20
1:20 10

NumaTop to przydatne narzędzie opracowane przez firmę Intel do monitorowania lokalizacji pamięci uruchomieniowej i analizy procesów w systemach NUMA [10,11]. Narzędzie może identyfikować potencjalne wąskie gardła wydajności związane z NUMA, a tym samym pomagać w ponownym zrównoważeniu alokacji pamięci/procesora, aby zmaksymalizować potencjał systemu NUMA. Patrz [9], aby uzyskać bardziej szczegółowy opis.

Scenariusze użytkowania

Komputery obsługujące technologię NUMA umożliwiają wszystkim procesorom bezpośredni dostęp do całej pamięci — procesory postrzegają to jako pojedynczą, liniową przestrzeń adresową. Prowadzi to do wydajniejszego wykorzystania 64-bitowego schematu adresowania, co skutkuje szybszym przepływem danych, mniejszą replikacją danych i łatwiejszym programowaniem.

Systemy NUMA są dość atrakcyjne dla aplikacji po stronie serwera, takich jak eksploracja danych i systemy wspomagania decyzji. Co więcej, dzięki tej architekturze pisanie aplikacji do gier i oprogramowania o wysokiej wydajności staje się znacznie łatwiejsze.

Wniosek

Podsumowując, architektura NUMA dotyczy skalowalności, która jest jedną z jej głównych zalet. W procesorze NUMA jeden węzeł będzie miał większą przepustowość lub mniejsze opóźnienie, aby uzyskać dostęp do pamięci w tym samym węźle (np. lokalny procesor żąda dostępu do pamięci w tym samym czasie, co dostęp zdalny; priorytet ma lokalny procesor). To znacznie poprawi przepustowość pamięci, jeśli dane zostaną zlokalizowane w określonych procesach (a tym samym procesorach). Wadami są wyższe koszty przenoszenia danych z jednego procesora na drugi. Dopóki ten przypadek nie zdarza się zbyt często, system NUMA przewyższa systemy o bardziej tradycyjnej architekturze.

Linki i referencje

  1. Porównaj NVIDIA Tesla i Radeon Instinct, https://www.itcentralstation.com/products/comparisons/nvidia-tesla_vs_radeon-instinct
  2. Porównaj NVIDIA DGX-1 z Radeon Instinct, https://www.itcentralstation.com/products/comparisons/nvidia-dgx-1_vs_radeon-instinct
  3. Spójność pamięci podręcznej, Wikipedia, https://en.wikipedia.org/wiki/Cache_coherence
  4. Podglądanie autobusów, Wikipedia, https://en.wikipedia.org/wiki/Bus_snooping
  5. Protokoły koherencji pamięci podręcznej w systemach wieloprocesorowych, Geeks for geeks, https://www.geeksforgeeks.org/cache-coherence-protocols-in-multiprocessor-system /
  6. Informatyka i technologia – Proceedings of the International Conference (CST2016), Ning Cai (red.), World Scientific Publishing Co Pte Ltd, ISBN: 9789813146419
  7. Daniel P. Bovet i Marco Cesati: Understanding NUMA architecture in Understanding the Linux Kernel, wydanie 3, O’Reilly, https://www.oreilly.com/library/view/understanding-the-linux/0596005652/
  8. Frank Dennemann: Głębokie nurkowanie NUMA, część 1: Od UMA do NUMA, https://frankdenneman.nl/2016/07/07/numa-deep-dive-part-1-uma-numa/
  9. Colin Ian King: NumaTop: narzędzie do monitorowania systemu NUMA, http://smackerelofopinion.blogspot.com/2015/09/numatop-numa-system-monitoring-tool.html
  10. Numatop, https://github.com/intel/numatop
  11. Pakiet numatop dla Debiana GNU/Linux, https://packages.debian.org/buster/numatop
  12. Jonathan Kehayias: Zrozumienie niejednorodnego dostępu do pamięci/architektur (NUMA), https://www.sqlskills.com/blogs/jonathan/understanding-non-uniform-memory-accessarchitectures-numa/
  13. Nowości jądra Linux dla jądra 3.8, https://kernelnewbies.org/Linux_3.8
  14. Niejednolity dostęp do pamięci (NUMA), Wikipedia, https://en.wikipedia.org/wiki/Non-uniform_memory_access
  15. Dokumentacja zarządzania pamięcią w systemie Linux, NUMA, https://www.kernel.org/doc/html/latest/vm/numa.html
  16. Pakiet numactl dla Debiana GNU/Linux, https://packages.debian.org/sid/admin/numactl
  17. Pakiet numad dla Debiana GNU/Linux, https://packages.debian.org/buster/numad
  18. Jak sprawdzić, czy konfiguracja NUMA jest włączona czy wyłączona?, https://www.thegeekdiary.com/centos-rhel-jak-znaleźć-jeśli-numa-configuration-is-enabled-or-disabled/
  19. Powinowactwo procesora, Wikipedia, https://en.wikipedia.org/wiki/Processor_affinity

Dziękuję

Autorzy dziękują Geroldowi Rupprechtowi za wsparcie w przygotowaniu tego artykułu.

O Autorach

Plaxedes Nehanda to wszechstronna, samodzielna i wszechstronna osoba, która nosi wiele kapeluszy, w tym planistę wydarzeń, wirtualną asystentkę, transkrypcję, a także zapaloną badaczkę z Johannesburga w RPA.

Prince K. Nehanda jest inżynierem ds. oprzyrządowania i kontroli (metrologii) w Paeflow Metering w Harare, Zimbabwe.

Frank Hofmann pracuje w drodze – najlepiej z Berlina (Niemcy), Genewy (Szwajcaria) i Kapsztadu (RPA) – jako programista, trener i autor magazynów takich jak Linux-User i Linux Magazine. Jest także współautorem księgi zarządzania pakietami Debiana ( http://www.dpmb.org ).