Affinités des processus sous Slurm
Cet article explique la configuration adoptée concernant l'affinité des processus sous slurm, c'est à dire leur liaison avec les CPU des nœuds de calcul.
Affinité
L'
affinité d'un processus permet de le lier à un ou plusieurs cœurs sur une machine multi-cœur
Le processus sera ainsi cantonné à un ensemble donné de cœurs pour son exécution. Il ne pourra pas être exécuté par Linux sur les autres cœurs du serveur
Deux raisons ont conduits à activer automatiquement l'affinité sous slurm, que nous expliquons ci-après
Restriction des CPU
Le problème
Sur notre cluster, les nœuds de calcul fonctionnent par défaut en mode partagé : plusieurs jobs peuvent s'exécuter en même temps sur le même nœud
Dans un job slurm, vous demandez une réservation, par exemple pour 4 CPU
Mais vous avez la liberté de lancer plus de 4 processus simultanés, ou un processus avec plus de 4 threads : Slurm ne contrôle pas cela
Il y a donc un risque de surcharge du nœud qui va impacter les autres usagers
La solution
Slurm dispose de plusieurs mécanismes permettant de circonscrire les ressources utilisables
Nous utilisons le plus simple des deux via le paramètre TaskPlugin=task/affinity
Slurm positionnera automatiquement l'affinité des processus pour limiter le nombre de CPU utilisables à la valeur demandée dans --cpus-per-task
Un job mal construit qui demande 4 CPU mais lance par exemple 6 thread n'impactera pas les autres usagers, ses 6 threads ne pourront s'exécuter que sur les 4 cœurs alloués par slurm
Accès mémoires
Sur une architecture SMP, plusieurs phénomènes peuvent dégrader considérablement les performances
Sans rentrer dans les détails, en particulier le
cache miss sera accentué si un processus peut s'exécuter alternativement sur des processeurs différents
Il est donc conseillé pour optimiser la performance d'un programme de le lier à un cœur
Le gain de performance peut atteindre 40%
Références