Skip to content

Etat des ressources

Partitions

La commande sinfo permet de lister l'état des partitions. L'option -s permet d'avoir une vue résumée des files d'attentes et l'option -l permet d'obtenir plus d'informations. La partition par défaut est repérée par une astérisque. Par exemple:

[user1@hpc2 ~]$ sinfo -s
PARTITION AVAIL  TIMELIMIT   NODES(A/I/O/T)  NODELIST
normal*      up 1-00:00:00       22/13/0/35  hpcnode[01-35]
long         up 7-00:00:00        20/0/0/20  hpcnode[01-20]
debug        up    1:00:00          0/1/0/1  hpcnode36

[user1@hpc2 ~]$ sinfo -l
Fri Aug 28 12:38:26 2020
PARTITION AVAIL  TIMELIMIT   JOB_SIZE ROOT OVERSUBS     GROUPS  NODES       STATE NODELIST
normal*      up 1-00:00:00 1-infinite   no       NO        all      1    draining hpcnode20
normal*      up 1-00:00:00 1-infinite   no       NO        all     10     drained hpcnode[08-12,14-15,17-19]
normal*      up 1-00:00:00 1-infinite   no       NO        all      3       mixed hpcnode[01,05,21]
normal*      up 1-00:00:00 1-infinite   no       NO        all     21   allocated hpcnode[02,04,06-07,13,16,22-36]
normal*      up 1-00:00:00 1-infinite   no       NO        all      1        idle hpcnode03
long         up 7-00:00:00        1-6   no       NO        all      1    draining hpcnode20
long         up 7-00:00:00        1-6   no       NO        all     10     drained hpcnode[08-12,14-15,17-19]
long         up 7-00:00:00        1-6   no       NO        all      3   allocated hpcnode[07,13,16]
smp          up 3-00:00:00          1   no       NO        all      1       mixed hpcsmp01
debug        up    1:00:00          1   no       NO        all      1        idle hpcphi01
gpu          up 1-00:00:00 1-infinite   no       NO piaf,gpu,i      1       mixed iccfgpu01
gpu          up 1-00:00:00 1-infinite   no       NO piaf,gpu,i      1   allocated piafgpu01
gpu          up 1-00:00:00 1-infinite   no       NO piaf,gpu,i      2        idle hpcdgx01,hpcgpu01
fast         up    2:00:00 1-infinite   no       NO        all      9    draining hpcnode20,simatlabnode[01-02,04-06,08,10-11]
fast         up    2:00:00 1-infinite   no       NO        all     12     drained hpcnode[08-12,14-15,17-19],simatlabnode[03,07]
fast         up    2:00:00 1-infinite   no       NO        all      5       mixed hpcnode[01,05,21],hpcsmp01,iccfgpu01
fast         up    2:00:00 1-infinite   no       NO        all     23   allocated hpcnode[02,04,06-07,13,16,22-36],piafgpu01,simatlabnode09
fast         up    2:00:00 1-infinite   no       NO        all      1        idle hpcnode03

Les états les plus courants sont: idle (totalement disponible), mix (partiellement alloué), alloc (complétement alloué), down (inaccessible), drain (vidange des jobs en cours), maint (maintenance en cours).

La configuration détaillée des partitions peut être visualisée à l'aide de la commande scontrol show partition:

[user1@hpc2 ~]$ scontrol show partition normal
PartitionName=normal
   AllowGroups=ALL AllowAccounts=ALL AllowQos=ALL
   AllocNodes=ALL Default=YES
   DefaultTime=NONE DisableRootJobs=NO GraceTime=0 Hidden=NO
   MaxNodes=UNLIMITED MaxTime=1-00:00:00 MinNodes=1 LLN=NO MaxCPUsPerNode=UNLIMITED
   Nodes=hpcnode[01-12]
   Priority=1 RootOnly=NO ReqResv=NO Shared=NO PreemptMode=OFF
   State=UP TotalCPUs=320 TotalNodes=12 SelectTypeParameters=N/A
   DefMemPerCPU=3000 MaxMemPerNode=UNLIMITED

Nœuds de calcul

La commande sinfo -Nle permet d'avoir une vision centrée sur les nœuds plutôt que sur les partitions. Cela permet de voir rapidement la configuration CPU et RAM des nœuds.

[user1@hpc2 ~]$ sinfo -Nle
Tue Apr  7 14:32:18 2015
NODELIST        NODES PARTITION       STATE CPUS    S:C:T MEMORY TMP_DISK WEIGHT FEATURES REASON              
hpcnode[01-04]      4   normal*        idle   16    2:8:1  64364        0      1 noht,san none                
hpcnode[05-08]      4   normal*        idle   32    2:8:2  95634        0      1   ht,ivy none                
hpcnode[09-10]      2   normal*       mixed   32    2:8:2 129001        0      1   ht,ivy none                
hpcnode[11-12]      2   normal*        idle   32    2:8:2 129001        0      1   ht,ivy none                
hpcphi01            1     debug        idle   32    2:8:2  96695        0      1 ht,ivy,p none                

Tout comme pour les partitions, la configuration détaillée d'un nœud peut être obtenue avec la commande scontrol show node. Cela permet d'avoir notamment la liste des features des nœuds. Par exemple, pour hpcnode05 (processeur Ivy Bridge avec hyperthreading):

[user1@hpc2 ~]$ scontrol show node hpcnode05
NodeName=hpcnode05 Arch=x86_64 CoresPerSocket=8
   CPUAlloc=0 CPUErr=0 CPUTot=32 CPULoad=0.00 Features=ht,ivy
   Gres=(null)
   NodeAddr=hpcnode05 NodeHostName=hpcnode05 Version=14.11
   OS=Linux RealMemory=95634 AllocMem=0 Sockets=2 Boards=1
   State=IDLE ThreadsPerCore=2 TmpDisk=0 Weight=1
   BootTime=2015-04-01T13:53:51 SlurmdStartTime=2015-04-01T13:54:06
   CurrentWatts=0 LowestJoules=0 ConsumedJoules=0
   ExtSensorsJoules=n/s ExtSensorsWatts=0 ExtSensorsTemp=n/s

Jobs

La commande squeue permet de lister les jobs en cours d'exécution. La colonne ST permet notamment de connaitre l'état du job: R (Running), PD (Pending), S (Suspended), F (Failed), CD (Completed) entre autres.

Dans l'exemple suivant, il y a un job en cours d'exécution sur 4 nœuds et un job en attente de ressources:

[user1@hpc2 ~]$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
               460    normal ray_vird    user1 PD       0:00      2 (Resources)
               455      long ray_k30_    user2  R   22:15:20      4 hpcnode[09-12]

Le détail d'un job est obtenu avec la commande scontrol show job. Dans l'exemple précédent, on peut voir que le job 460 a demandé explicitement des nœuds (cf. attribut ReqNodeList) qui sont déjà alloués au job 455:

[user1@hpc2 ~]$ scontrol show job 460
JobId=460 JobName=ray_virdna1004_new.sh
   UserId=user1(5000) GroupId=infra(5000)
   Priority=3230 Nice=0 Account=infra QOS=normal
   JobState=PENDING Reason=Resources Dependency=(null)
   Requeue=1 Restarts=0 BatchFlag=1 Reboot=0 ExitCode=0:0
   RunTime=00:00:00 TimeLimit=1-00:00:00 TimeMin=N/A
   SubmitTime=2015-04-10T13:58:26 EligibleTime=2015-04-10T13:58:26
   StartTime=2015-04-12T15:43:08 EndTime=Unknown
   PreemptTime=None SuspendTime=None SecsPreSuspend=0
   Partition=normal AllocNode:Sid=hpc2:1019
   ReqNodeList=hpcnode[09-10] ExcNodeList=(null)
   NodeList=(null)
   NumNodes=2 NumCPUs=16 CPUs/Task=1 ReqB:S:C:T=0:0:*:*
   Socks/Node=* NtasksPerN:B:S:C=0:0:*:1 CoreSpec=*
   MinCPUsNode=1 MinMemoryCPU=4000M MinTmpDiskNode=0
   Features=(null) Gres=(null) Reservation=(null)
   Shared=OK Contiguous=0 Licenses=(null) Network=(null)
   Command=/home/user1/tests/ray/ray_virdna1004_new.sh
   WorkDir=/home/user1/tests/ray
   StdErr=/home/user1/tests/ray/slurm-460.out
   StdIn=/dev/null
   StdOut=/home/user1/tests/ray/slurm-460.out

Pour avoir des informations comptables sacct :

sur tous les jobs lancés à compter d'une date pour un utilisateur :

[user1@hpc2 ~]$ sacct -u user1 --format=JobID,JobName,MaxRSS,Elapsed -S 2021-01-18

ou bien sur l'exécution d'un job particulier :

[user1@hpc2 ~]$ sacct -a -o JobID,State,ReqCPUS,ReqMem,Elapsed,CPUTime,MaxRSS,Start,Partition -j 32191
       JobID      State  ReqCPUS     ReqMem    Elapsed    CPUTime     MaxRSS               Start  Partition 
------------ ---------- -------- ---------- ---------- ---------- ---------- ------------------- ---------- 
32191      COMPLETED        1    10000Mn   00:00:25   00:00:50            2021-01-11T13:45:28     normal 
32191.ba+  COMPLETED        2    10000Mn   00:00:25   00:00:50      1628K 2021-01-11T13:45:28 

Espace de travail des jobs

Sur le cluster de calcul, chaque noeud possède son propre espace de travail pour les jobs situé dans /storage/scratch/ . À la soumission d'un job, on indique la quantité d'espace disque nécessaire dans cet espace de travail pour que le job se déroule correctement. Cela permet d'éviter l'exécution du job sur un noeud de calcul où tout l'espace de travail serait déjà occupé par un autre job. Le paramètre de soumission sbatch/srun est --tmp=10G par exemple pour demander 10 Go d'espace de travail.

Conjointement à cela, il faut donc s'assurer que le job dépose ses fichiers temporaires de travail dans un répertoire situé sous /storage/scratch/ et non pas dans /tmp/. Deux cas de figure se présentent alors :

  • soit les outils utilisés dans le job permettent cette configuration via un paramètre sur leur ligne de commande lors du lancement ;
  • soit les outils utilisés par le job ne le permettent pas et une astuce avec des variables d'environnement permet de modifier le comportement de l'outil.

Pour répondre à cela, le modèle suivant est proposé :

#!/bin/bash
#SBATCH --job-name=simple-example
#SBATCH --partition=normal
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=4
#SBATCH --mem=16g
#SBATCH --mail-type=ALL
#SBATCH --mail-user=user.email@uca.fr
#SBATCH --time=02:00:00
#SBATCH --tmp=10G

# Prepare working directory on node
WORKDIR=/storage/scratch/$LOGNAME/$SLURM_JOB_ID
TMPDIR=$WORKDIR/tmp
mkdir -p $WORKDIR
mkdir -p $TMPDIR

# Tell programs to use $TMPDIR instead of /tmp/ when creating temporary files
# (/tmp/ is small, /storage/scratch/ offers more space)
export TMPDIR

# Reminder : we requested 10GB as scratch space, the total amount of data in
# $WORKDIR should not exceed that size.

# Manage data, perform whatever the job is supposed to compute.
...
mytool --input-data=... --output-directory=... --working-directory=$TMPDIR ...
...

# Don't forget to copy selected output files into a durable storage
# Clean-up the working directory
rm -rf $WORKDIR

# end of script

De cette manière, le système répondra aux outils demandant un espace ou un fichier temporaire avec le stockage /storage/scratch/ . On peut même créer un espace pour les données en entrée du job, et inclure une phase de récupération des données avant l'exécution de l'outil, ainsi qu'un espace de sortie :

#!/bin/bash
#SBATCH --job-name=simple-example
#SBATCH --partition=normal
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=4
#SBATCH --mem=16g
#SBATCH --mail-type=ALL
#SBATCH --mail-user=user.email@uca.fr
#SBATCH --time=02:00:00
#SBATCH --tmp=10G

# Prepare working directory on node
WORKDIR=/storage/scratch/$LOGNAME/$SLURM_JOB_ID
TMPDIR=$WORKDIR/tmp
INPUTDIR=$WORKDIR/input
OUTPUTDIR=$WORKDIR/output
mkdir -p $WORKDIR
mkdir -p $TMPDIR
mkdir -p $INPUTDIR
mkdir -p $OUTPUTDIR

# Tell programs to use $TMPDIR instead of /tmp/ when creating temporary files
# (/tmp/ is small, /storage/scratch/ offers more space)
export TMPDIR

# Manage input data, from a web source, your HOME directory, or the Mesocentre S3 storage service
INPUTFILE=$INPUTDIR/genome.fasta
wget "http://biodatabanks.example/files/genome.fasta" -O $INPUTFILE
...

# Reminder : we requested 10GB as scratch space, the total amount of data in
# $WORKDIR should not exceed that size.

# Perform whatever the job is supposed to compute.
mytool --input-data=$INPUTFILE --output-directory=$OUTPUTDIR --working-directory=$TMPDIR ...

# Copy selected output files into a durable storage, for instance the user HOME directory,
# an external storage service, or the Mesocentre S3 storage facility
cp $OUTPUTDIR/genome.analysis.txt $HOME/output/
...

# Clean-up the working directory
rm -rf $WORKDIR

# end of script

Dans cet exemple précédent :

  • un job multithread avec 4 CPU est demandé
  • avec 16Go de RAM
  • 10Go d'espace de travail
  • sur la partition normal
  • ne durant pas plus de 2h
  • avec notifications par mail sur tous les événements liés au job