Skip to content

Slurm Installation

Étendre le cluster avec un nouveau nœud

Cette section décrit la procédure pour ajouter un nœud de calcul au cluster.

Les commandes suivantes seront précédées de :

  • (front): dans le cas où la commande doit être exécutée sur la frontale
  • (node): dans le cas où la commande doit être exécutée sur la machine à ajouter

1. Configurer NFS sur le nouveau nœud

Installer le client NFS.

(node): sudo apt update
(node): sudo apt install nfs-client
(node): sudo yum check-update
(node): sudo yum install nfs-utils

Ajouter une ligne dans le fichier /etc/fstab :

(node): echo "monolithe.soc.lip6.fr:/nfs /nfs nfs" | sudo tee --append /etc/fstab

Puis monter le nouveau disque:

(node): sudo mkdir /nfs
(node): sudo mount /nfs

Warning

Avant de faire $sudo mount /nfs, le fichier /etc/fstab aura peut être besoin d'être re-chargé avec la commande suivante : $ sudo systemctl daemon-reload.

2. Mettre à jour la configuration du cluster

Mettons à jour la configuration de Slurm sur la frontale :

(front): sudo vim /nfs/slurm/slurm.conf

Aller à la fin du fichier et rajouter la ligne suivante pour ajouter le nœud ainsi que la partition correspondante:

NodeName=XXX NodeAddr=XXX.soc.lip6.fr CPUs=YY State=UNKNOWN
PartitionName=XXX Nodes=XXX Default=NO MaxTime=INFINITE State=UP

Remplacer XXX par le nom du nœud à ajouter et YY par son nombre de coeurs.

Info

Une partition pour slurm est un ensemble de nœuds de calculs capables de se répartir l'exécution d'une tâche. Dans notre cas nous assignons une partition à un unique nœud : une partition = une machine.

Info

Pour notre utilisation, nous souhaitons que chaque nœud de calcul dispose d'une partition. Mais il est possible (et d'ailleurs courant) de créer une partition avec plusieurs nœuds.

Redémarrer Slurm control deamon :

(front): sudo systemctl restart slurmctld
(front): sudo scontrol reconfigure

3. Installer Munge sur le nouveau nœud

Munge gère l'authentifications des utilisateurs Slurm sur le nœud de calcul.

Configurons les permissions relatives à Munge :

(node): export MUNGEUSER=1101 
(node): sudo groupadd -g $MUNGEUSER munge 
(node): sudo useradd -m -c "MUNGE Uid 'N' Gid Emporium" -d /var/lib/munge -u $MUNGEUSER -g munge -s /sbin/nologin munge 

Installer Munge.

(node): sudo apt-get install -y munge libmunge-dev
(node): sudo yum install munge munge-devel

Puis copier la clé d'authentification Munge :

(front): sudo cp /nfs/slurm/munge.key /nfs/slurm/munge_tmp.key
(front): sudo chmod +r /nfs/slurm/munge_tmp.key
(node): sudo cp /nfs/slurm/munge_tmp.key /etc/munge/munge.key
(front): sudo rm /nfs/slurm/munge_tmp.key
(node): sudo chown munge:munge /etc/munge/munge.key
(node): sudo chmod 400 /etc/munge/munge.key

Et enfin démarrer le service :

(node): sudo systemctl enable munge
(node): sudo systemctl start munge

4. Installer Slurm sur le nouveau nœud (depuis les sources)

Sur le cluster, Slurm 19.05 est installée. Il est possible que certaines distributions Linux ne proposent pas exactement cette même version et donc le client Slurm (slurmd) ne pourra pas fonctionner correctement avec la frontale (slurmctld). Dans ce cas il est nécessaire de compiler Slurm depuis les sources.

Configuration des permissions relatives à Slurm :

(node): export SLURMUSER=1102 
(node): sudo groupadd -g $SLURMUSER slurm 
(node): sudo useradd -m -c "SLURM workload manager" -d /var/lib/slurm -u $SLURMUSER -g slurm -s /bin/bash slurm

Récupérer la bonne version de Slurm depuis le dépôt GitHub, compiler et installer :

(node): mkdir $HOME/softwares
(node): cd $HOME/softwares/
(node): git clone --branch slurm-19.05 https://github.com/SchedMD/slurm.git
(node): cd slurm
(node): ./configure --prefix /opt/slurm-19.05
(node): make -j4
(node): sudo make install
(node): sudo ln -s /opt/slurm-19.05/ /opt/slurm
(node): sudo ldconfig -n /opt/slurm/lib/
(node): sudo mkdir /opt/slurm-19.05/etc/
(node): sudo ln -s /nfs/slurm/slurm.conf /opt/slurm-19.05/etc/slurm.conf
(node): echo "CgroupMountpoint=/sys/fs/cgroup" | sudo tee --append /opt/slurm-19.05/etc/cgroup.conf

Danger

Avant de compiler Slurm il est très important d'avoir installé Munge et en particulier libmunge-dev/munge-devel. En effet, le ./configure de Slurm ne compilera pas l'extension "Slurm-Munge" si libmunge-dev/munge-devel n'est pas installé sur la machine.

Warning

Sur Fedora (M1 Ultra) et sur Ubuntu 23.10 la dernière commande ($ echo "CgroupMountpoint=/sys/fs/cgroup" | sudo tee --append /opt/slurm-19.05/etc/cgroup.conf) n'est pas suffisante. Il faut ouvrir le fichier /opt/slurm-19.05/etc/cgroup.conf en RW et remplacer son contenu par :

# CgroupMountpoint=/sys/fs/cgroup
CgroupAutomount=yes
ConstrainCores=no
ConstrainRAMSpace=no

Warning

On Ubuntu 23.10 and 24.04 you may encounter the following error:

make[3]: Entering directory '/home/cassagnea/softwares/slurm/doc/html'
`dirname accounting.shtml`/shtml2html.py 19.05 accounting.shtml
/usr/bin/env: ‘python’: No such file or directory
You can easily fix it by opening the doc/html/shtml2html.py file and replace the first line as follow:
#!/usr/bin/env python3

Copier le script de démarrage systemd :

(node): sudo cp /nfs/slurm/slurmd.service /lib/systemd/system/

On active et on lance le service slurmd :

(node): sudo systemctl daemon-reload
(node): sudo systemctl enable slurmd
(node): sudo systemctl start slurmd
(node): sudo systemctl status slurmd

Tips

Si la dernière commande montre que slurmd n'a pas réussi à se lancer, cela vaut le coup d'aller regarder le fichier de log... :

(node): sudo vim /var/log/slurmd.log

Il faut redémarrer munge après slumrd...

sudo systemctl restart munge.service

Enfin, si vous le souhaitez, cela peut être une bonne idée d'ajouter Slurm au PATH :

(node): echo 'export PATH=$PATH:/opt/slurm/bin' >> $HOME/.bashrc
(node): source $HOME/.bashrc

Warning

On Linux Fedora Asahi rel. 39 OS (M1 Ultra) there is a firewall blocking the Slurm traffic on the network. To disable the firewall you can do:

(node): sudo systemctl disable --now firewalld

5. Propagate the NFS Users on the New Node

For this you can simply call the upusers-nfs script:

(front): sudo upusers-nfs

6. Tester le cluster

Pour contrôler l'état du démon slurm sur le nouveau nœud :

(node): systemctl status slurmd.service

Pour tester si le nouveau nœud peut communiquer avec le nœud de contrôle :

(node): scontrol ping

Pour tester si la frontale reconnaît le nouveau nœud :

(front): sinfo

Des exemples de tâches simples à tester :

# affiche le nom de la machine où est éxécutée la tache
(front): srun -p [partName] hostname
# lance un shell interactif
(front): srun -p [partName] --pty bash -i
# permet de voir les tâches en cours sur le cluster
(front): squeue

Debug

Commandes utiles pour debug :

(front): scontrol show node
(node): slurmd -C

Tester le fonctionnement de Munge:

(node) ssh XXX@monolithe.soc.lip6.fr munge -n | unmunge

En cas de redémarrage d'un nœud il peut être utile de mettre à jour son état vis-à-vis de Slurm :

(front): sudo scontrol update NodeName=xxx state=resume

Warning

En cas de comportement étrange après un reboot de la frontale, éxécuter systemctl status slurmctld pour vérifier si le service slurmctld s'est lancé.

Dans le cas où le service slurmctld est lancé mais ne détecte pas que ses nœuds sont actifs, il est nécessaire de mettre à jour leurs états:

(front): sudo scontrol update NodeName=orinagx,orinnx state=resume

Dans le cas où le service ne s'est pas lancé, il peut être nécéssaire de recréer un dossier slurm dans /run :

(front): sudo mkdir /run/slurm
(front): sudo systemctl restart slurmctld

Bon à savoir

Quand on redémarre la frontale, on redémarre le serveur NFS et cela a pour conséquence de planter les NFS client sur tous les nœuds... Il faut ensuite remonter /nfs sur les nœuds pour que le NFS fonctionne de nouveau :

(node): sudo umount /nfs
(node): sudo mount /nfs

Si on veut arrêter slurmd, munge et nfs sur un nœud (par exemple pour éviter que cela n'impacte les mesures) :

sudo systemctl stop slurmd.service
sudo systemctl stop munge.service
sudo umount /nfs

Et pour les relancer :

sudo mount /nfs
sudo systemctl start munge.service
sudo systemctl enable slurmd.service
sudo systemctl start slurmd.service
sudo scontrol ping

Warning

L'ordre d’exécution des commandes précédentes est important. L'horloge du node doit être synchronisée avec celle du front pour permettre l'authentification.

Sources