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