Comprendre l'architecture NUMA

Understanding Numa Architecture



Concevoir des ordinateurs est toujours un compromis. Les quatre composants de base d'un ordinateur - l'unité centrale (CPU) ou processeur, la mémoire, le stockage et la carte de connexion des composants (système de bus d'E/S) - sont combinés aussi intelligemment que possible pour créer une machine qui est à la fois rentable et puissant. Le processus de conception implique principalement une optimisation des processeurs (coprocesseurs, configuration multicœur), du type et de la quantité de mémoire, du stockage (disques, système de fichiers), ainsi que du prix. L'idée derrière les coprocesseurs et l'architecture multicœur est répartir les opérations sur autant d'unités de calcul uniques dans le plus petit espace possible et rendre l'exécution parallèle d'instructions de calcul plus disponible et abordable. En termes de mémoire, il s'agit de la quantité ou de la taille qui peut être traitée par l'unité de calcul individuelle et du type de mémoire qui fonctionne avec la latence la plus faible possible. Le stockage appartient à la mémoire externe et ses performances dépendent du type de disque, du système de fichiers utilisé, du threading, du protocole de transfert, de la structure de communication et du nombre de périphériques de mémoire connectés.

La conception des bus d'E/S représente les artères informatiques et détermine de manière significative la quantité et la vitesse d'échange de données entre les composants individuels énumérés ci-dessus. La première catégorie est dominée par les composants utilisés dans le domaine du calcul haute performance (HPC). À la mi-2020, parmi les représentants contemporains du HPC figurent Nvidia Tesla et DGX, Radeon Instinct et les produits d'accélérateur basés sur GPU Intel Xeon Phi (voir [1,2] pour des comparaisons de produits).







Comprendre NUMA

L'accès à la mémoire non uniforme (NUMA) décrit une architecture de mémoire partagée utilisée dans les systèmes de multitraitement contemporains. NUMA est un système informatique composé de plusieurs nœuds uniques de telle sorte que la mémoire globale est partagée entre tous les nœuds : chaque CPU se voit attribuer sa propre mémoire locale et peut accéder à la mémoire des autres CPU du système [12,7].



NUMA est un système intelligent utilisé pour connecter plusieurs unités centrales de traitement (CPU) à n'importe quelle quantité de mémoire informatique disponible sur l'ordinateur. Les nœuds NUMA uniques sont connectés sur un réseau évolutif (bus d'E/S) de sorte qu'une CPU peut systématiquement accéder à la mémoire associée à d'autres nœuds NUMA.



La mémoire locale est la mémoire que le CPU utilise dans un nœud NUMA particulier. La mémoire étrangère ou distante est la mémoire qu'une CPU prend d'un autre nœud NUMA. Le terme ratio NUMA décrit le rapport entre le coût d'accès à la mémoire étrangère et le coût d'accès à la mémoire locale. Plus le ratio est élevé, plus le coût est élevé, et donc plus il faut de temps pour accéder à la mémoire.





Cependant, cela prend plus de temps que lorsque ce processeur accède à sa propre mémoire locale. L'accès à la mémoire locale est un avantage majeur, car il combine une faible latence avec une bande passante élevée. En revanche, l'accès à la mémoire appartenant à n'importe quel autre processeur a une latence plus élevée et des performances de bande passante inférieures.

Rétrospective : évolution des multiprocesseurs à mémoire partagée

Frank Dennemann [8] affirme que les architectures système modernes ne permettent pas vraiment d'accès à la mémoire uniforme (UMA), même si ces systèmes sont spécifiquement conçus à cet effet. En termes simples, l'idée du calcul parallèle était d'avoir un groupe de processeurs qui coopèrent pour calculer une tâche donnée, accélérant ainsi un calcul séquentiel par ailleurs classique.



Comme expliqué par Frank Dennemann [8], au début des années 1970, le besoin de systèmes capables de desservir plusieurs opérations d'utilisateurs simultanés et une génération excessive de données est devenu courant avec l'introduction des systèmes de bases de données relationnelles. Malgré le taux impressionnant de performances monoprocesseur, les systèmes multiprocesseurs étaient mieux équipés pour gérer cette charge de travail. Pour fournir un système rentable, l'espace d'adressage en mémoire partagée est devenu le centre de la recherche. Au début, les systèmes utilisant un commutateur crossbar ont été préconisés, mais cette complexité de conception a augmenté avec l'augmentation du nombre de processeurs, ce qui a rendu le système basé sur le bus plus attrayant. Les processeurs d'un système de bus [peuvent] accéder à l'intégralité de l'espace mémoire en envoyant des requêtes sur le bus, un moyen très économique d'utiliser la mémoire disponible de manière optimale.

Cependant, les systèmes informatiques basés sur le bus présentent un goulot d'étranglement : la quantité limitée de bande passante qui entraîne des problèmes d'évolutivité. Plus le nombre de processeurs ajoutés au système est élevé, moins la bande passante disponible par nœud est faible. De plus, plus on ajoute de processeurs, plus le bus est long et donc plus la latence est élevée.

La plupart des processeurs ont été construits dans un plan à deux dimensions. Les processeurs devaient également avoir des contrôleurs de mémoire intégrés ajoutés. La solution simple d'avoir quatre bus mémoire (en haut, en bas, à gauche, à droite) pour chaque cœur de processeur permettait une bande passante disponible complète, mais cela ne va pas plus loin. Les processeurs ont stagné avec quatre cœurs pendant un temps considérable. L'ajout de traces au-dessus et au-dessous a permis aux bus directs de traverser les processeurs diagonalement opposés à mesure que les puces devenaient 3D. Placer un processeur à quatre cœurs sur une carte, qui est ensuite connectée à un bus, était l'étape logique suivante.

Aujourd'hui, chaque processeur contient de nombreux cœurs avec un cache sur puce partagé et une mémoire hors puce et a des coûts d'accès à la mémoire variables dans différentes parties de la mémoire au sein d'un serveur.

Améliorer l'efficacité de l'accès aux données est l'un des principaux objectifs de la conception contemporaine des processeurs. Chaque cœur de processeur était doté d'un petit cache de niveau 1 (32 Ko) et d'un cache de niveau 2 plus grand (256 Ko). Les différents cœurs partageraient par la suite un cache de niveau 3 de plusieurs Mo, dont la taille a considérablement augmenté au fil du temps.

Pour éviter les échecs de cache - demander des données qui ne sont pas dans le cache - beaucoup de temps de recherche est consacré à trouver le bon nombre de caches CPU, de structures de mise en cache et d'algorithmes correspondants. Voir [8] pour une explication plus détaillée du protocole de mise en cache snoop [4] et de cohérence de cache [3,5], ainsi que les idées de conception derrière NUMA.

Support logiciel pour NUMA

Il existe deux mesures d'optimisation logicielle qui peuvent améliorer les performances d'un système prenant en charge l'architecture NUMA : l'affinité du processeur et le placement des données. Comme expliqué dans [19], l'affinité du processeur […] permet la liaison et la dissociation d'un processus ou d'un thread à un seul processeur, ou à une plage de processeurs afin que le processus ou le thread s'exécute uniquement sur le ou les processeurs désignés plutôt que sur n'importe quel processeur. Le terme placement de données fait référence à des modifications logicielles dans lesquelles le code et les données sont conservés aussi près que possible en mémoire.

Les différents systèmes d'exploitation UNIX et liés à UNIX prennent en charge NUMA des manières suivantes (la liste ci-dessous est tirée de [14]) :

  • Prise en charge de Silicon Graphics IRIX pour l'architecture ccNUMA sur 1240 CPU avec la série de serveurs Origin.
  • Microsoft Windows 7 et Windows Server 2008 R2 ont ajouté la prise en charge de l'architecture NUMA sur 64 cœurs logiques.
  • La version 2.5 du noyau Linux contenait déjà une prise en charge de base de NUMA, qui a été encore améliorée dans les versions ultérieures du noyau. La version 3.8 du noyau Linux a apporté une nouvelle base NUMA qui a permis le développement de politiques NUMA plus efficaces dans les versions ultérieures du noyau [13]. La version 3.13 du noyau Linux a apporté de nombreuses politiques visant à rapprocher un processus de sa mémoire, ainsi que la gestion des cas, comme le partage des pages mémoire entre les processus, ou l'utilisation de pages énormes transparentes ; de nouveaux paramètres de contrôle du système permettent d'activer ou de désactiver l'équilibrage NUMA, ainsi que la configuration de divers paramètres d'équilibrage de la mémoire NUMA [15].
  • Oracle et OpenSolaris modélisent l'architecture NUMA avec l'introduction de groupes logiques.
  • FreeBSD a ajouté l'affinité NUMA initiale et la configuration de la politique dans la version 11.0.

Dans le livre Computer Science and Technology, Actes de la conférence internationale (CST2016), Ning Cai suggère que l'étude de l'architecture NUMA était principalement axée sur l'environnement informatique haut de gamme et proposait le partitionnement Radix (NaRP) compatible avec NUMA, qui optimise les performances. de caches partagés dans les nœuds NUMA pour accélérer les applications de business intelligence. En tant que tel, NUMA représente un juste milieu entre les systèmes à mémoire partagée (SMP) avec quelques processeurs [6].

NUMA et Linux

Comme indiqué ci-dessus, le noyau Linux prend en charge NUMA depuis la version 2.5. Debian GNU/Linux et Ubuntu offrent tous deux la prise en charge de NUMA pour l'optimisation des processus avec les deux packages logiciels numactl [16] et numad [17]. À l'aide de la commande numactl, vous pouvez lister l'inventaire des nœuds NUMA disponibles dans votre système [18] :

# numactl --hardware
disponible:2nœuds(0-1)
nœud0processeur :0 1 2 3 4 5 6 7 16 17 18 19 vingt vingt-et-un 22 2. 3
nœud0Taille:8157Mo
nœud0libre:88Mo
nœud1processeur :8 9 dix Onze 12 13 14 quinze 24 25 26 27 28 29 30 31
nœud1Taille:8191Mo
nœud1libre:5176Mo
distances aux nœuds :
nœud0 1
0:dix vingt
1:vingt dix

NumaTop est un outil utile développé par Intel pour surveiller la localisation de la mémoire d'exécution et analyser les processus dans les systèmes NUMA [10,11]. L'outil peut identifier les goulots d'étranglement potentiels liés aux performances de NUMA et ainsi aider à rééquilibrer les allocations mémoire/CPU pour maximiser le potentiel d'un système NUMA. Voir [9] pour une description plus détaillée.

Scénarios d'utilisation

Les ordinateurs qui prennent en charge la technologie NUMA permettent à tous les processeurs d'accéder directement à l'ensemble de la mémoire - les processeurs voient cela comme un espace d'adressage linéaire unique. Cela conduit à une utilisation plus efficace du schéma d'adressage 64 bits, ce qui entraîne un mouvement plus rapide des données, moins de réplication des données et une programmation plus facile.

Les systèmes NUMA sont très intéressants pour les applications côté serveur, telles que l'exploration de données et les systèmes d'aide à la décision. De plus, l'écriture d'applications pour les jeux et les logiciels hautes performances devient beaucoup plus facile avec cette architecture.

Conclusion

En conclusion, l'architecture NUMA aborde l'évolutivité, qui est l'un de ses principaux avantages. Dans un processeur NUMA, un nœud aura une bande passante plus élevée ou une latence plus faible pour accéder à la mémoire sur ce même nœud (par exemple, le processeur local demande un accès à la mémoire en même temps que l'accès à distance ; la priorité est sur le processeur local). Cela améliorera considérablement le débit de la mémoire si les données sont localisées dans des processus spécifiques (et donc des processeurs). Les inconvénients sont les coûts plus élevés du transfert de données d'un processeur à un autre. Tant que ce cas ne se produit pas trop souvent, un système NUMA surpassera les systèmes avec une architecture plus traditionnelle.

Liens et références

  1. Comparez NVIDIA Tesla vs Radeon Instinct, https://www.itcentralstation.com/products/comparisons/nvidia-tesla_vs_radeon-instinct
  2. Comparez NVIDIA DGX-1 et Radeon Instinct, https://www.itcentralstation.com/products/comparisons/nvidia-dgx-1_vs_radeon-instinct
  3. Cohérence du cache, Wikipédia, https://en.wikipedia.org/wiki/Cache_coherence
  4. espionnage de bus, Wikipédia, https://en.wikipedia.org/wiki/Bus_snooping
  5. Protocoles de cohérence de cache dans les systèmes multiprocesseurs, Geeks pour les geeks, https://www.geeksforgeeks.org/cache-coherence-protocols-in-multiprocessor-system /
  6. Informatique et technologie – Actes de la conférence internationale (CST2016), Ning Cai (éd.), World Scientific Publishing Co Pte Ltd, ISBN : 9789813146419
  7. Daniel P. Bovet et Marco Cesati : Understanding NUMA architecture in Understanding the Linux Kernel, 3rd edition, O'Reilly, https://www.oreilly.com/library/view/understanding-the-linux/0596005652/
  8. Frank Dennemann : NUMA Deep Dive Partie 1 : De l'UMA à la NUMA, https://frankdenneman.nl/2016/07/07/numa-deep-dive-part-1-uma-numa/
  9. Colin Ian King : NumaTop : un outil de surveillance du système NUMA, http://smackerelofopinion.blogspot.com/2015/09/numatop-numa-system-monitoring-tool.html
  10. Numatop, https://github.com/intel/numatop
  11. Paquet numatop pour Debian GNU / Linux, https://packages.debian.org/buster/numatop
  12. Jonathan Kehayias : Comprendre les architectures/accès mémoire non uniformes (NUMA), https://www.sqlskills.com/blogs/jonathan/understanding-non-uniform-memory-accessarchitectures-numa/
  13. Nouvelles du noyau Linux pour le noyau 3.8, https://kernelnewbies.org/Linux_3.8
  14. Accès mémoire non uniforme (NUMA), Wikipédia, https://en.wikipedia.org/wiki/Non-uniform_memory_access
  15. Documentation de gestion de la mémoire Linux, NUMA, https://www.kernel.org/doc/html/latest/vm/numa.html
  16. Paquet numactl pour Debian GNU/Linux, https://packages.debian.org/sid/admin/numactl
  17. Paquet numad pour Debian GNU/Linux, https://packages.debian.org/buster/numad
  18. Comment savoir si la configuration NUMA est activée ou désactivée ?, https://www.thegeekdiary.com/centos-rhel-how-to-find-if-numa-configuration-is-enabled-or-disabled/
  19. Affinité de processeur, Wikipédia, https://en.wikipedia.org/wiki/Processor_affinity

Merci

Les auteurs tiennent à remercier Gerold Rupprecht pour son soutien lors de la préparation de cet article.

à propos des auteurs

Plaxedes Nehanda est une personne polyvalente, autonome et polyvalente qui porte de nombreux chapeaux, parmi lesquels un organisateur d'événements, un assistant virtuel, un transcripteur, ainsi qu'un chercheur passionné, basé à Johannesburg, en Afrique du Sud.

Prince K. Nehanda est ingénieur en instrumentation et contrôle (métrologie) chez Paeflow Metering à Harare, au Zimbabwe.

Frank Hofmann travaille sur la route – de préférence depuis Berlin (Allemagne), Genève (Suisse) et Cape Town (Afrique du Sud) – en tant que développeur, formateur et auteur pour des magazines comme Linux-User et Linux Magazine. Il est également co-auteur du livre sur la gestion des paquets Debian ( http://www.dpmb.org ).