#!/bin/bash #------------------- CHECKPOINT DMTCP ex6 --------------------------- # # # commande: oarsub -S ./checkpoint-dmtcp-scratch-ex6.oar # L'exemple 6 met en oeuvre la possibilité d'effectuer un checkpoint # en travaillant sur le répertoire scratch ET avec une reprise # automatique (option idemtpotent) sur un nœud potentiellement # différent à chaque redémarrage. # - la seule difficulté est de récupérer les checkpoints sur le HOME_DIR # à chaque fin de run «avorté» (si le walltime est atteint) # - Pour la demo: # - le timer est de 20 minutes # - le walltime fixé à 10mn # - donc 3 runs avec l'option --checkpoint 120 (checkpoint 10mn-120s=8mn) #-------------- paramètres OAR--------------------------- # walltime de 10min #OAR -l core=1,walltime=00:10:00 #OAR -n dmtcp-scratch #les jobs successifs ecrivent dans des fichiers différents #OAR -O OAR-ckpt-dmtcp-ex6.%jobid%.out #OAR -E OAR-ckpt-dmtcp-ex6.%jobid%.err #OAR -q default # A EDITER apres consultation de : # https://www-calculco.univ-littoral.fr/outils_visu/drawgantt/ # Si pour une raison d'architecture ( option de compilation) # il faut des hôtes/processeurs du même type, par ex: ##OAR -p nodemodel = 'Dell_R630' # ou: ##OAR -p nodemodel = 'Dell_R820' # au choix : default ou besteffort #OAR -t besteffort # pour une relance auto (c'est l'objectif!) #OAR -t idempotent # checkpoint OAR 120 s avant le walltime # Pour un exemple réel ( plusieurs heures, gros contexte, 600s (10mn)) #OAR --checkpoint 120 # chargement du module dmtcp source /nfs/opt/env/env.sh > /dev/null 2>&1 module load dmtcp > /dev/null 2>&1 #---------- la tâche à exécuter ------------------------ # doit être contenu dans l'archive ./RUN_DIR.tgz PROG=timer20mn RUN_DIR=scratch-ex6 #----------- pré-traitement ----------------------------- GROUP=$(id -gn $OAR_USER) # Création du répertoire temporaire local dans scratch #SCRATCHDIR=/scratch/$GROUP/$OAR_USER/$OAR_JOB_NAME.$OAR_JOBID SCRATCHDIR=/scratch/$GROUP/$OAR_USER/$OAR_JOB_NAME [ ! -d $SCRATCHDIR ] && mkdir $SCRATCHDIR # Recopie de l'archive du programme (et éventuels checkpoints # et données des runs précendents) dans le répertoire cd $SCRATCHDIR # au 1er lancement, par exemple: # backup de l'archive dans le rép d'origine # (celle-ci est modifiée à chaque run car contient les checkpoints) if [ ! -f $OAR_WORKDIR/$RUN_DIR.tgz.ORG ]; then cp $OAR_WORKDIR/$RUN_DIR.tgz $OAR_WORKDIR/$RUN_DIR.tgz.ORG fi # copie sur le scratch cp $OAR_WORKDIR/$RUN_DIR.tgz . # deploiement de l'archive tar xzf $RUN_DIR.tgz # supression de l'archive rm $RUN_DIR.tgz cd $RUN_DIR # sur quel noeud sommes-nous? /bin/hostname echo "Debut du jobs ou restart ?" # si c'est une reprise if [ -f dmtcp_restart_script.sh ]; then LAST_HOST=`cat hostname.txt` # sur quel noeud ? /bin/hostname # si le dernier run était sur un autre noeud, modifier # le script de redémarrage if [ $(hostname) != $LAST_HOST ]; then echo " -> reprise du job sur autre noeud" NEW_HOST=`/bin/hostname` sed -i s/"$LAST_HOST"/"$NEW_HOST"/g dmtcp_restart_script.sh # optionnel (pour debug) cp hostname.txt hostname_last.txt # backup du nouvel hostname /bin/hostname > hostname.txt else echo "-> reprise sur le meme noeud" fi # relancer depuis le dernier checkpoint ./dmtcp_restart_script.sh & PROGPID=$! else echo " -> Debut du jobs" # sauvegarde du hostname /bin/hostname > hostname.txt dmtcp_launch ./timer20mn & PROGPID=$! fi #--------------------------------------------------------- # gestion du checkpoint OAR #--------------------------------------------------------- # fonction de traitement du signal OAR sighandler() { echo "reception checkpoint OAR (signal12)" # demande de checkpoint (-c) au coordinateur dmtcp dmtcp_command -c sleep 5 # regroupement et ménage pour la relance du job # --------------------------------------------- mv $OAR_STDOUT . mv $OAR_STDERR . # archivage des fichiers :hosts, checkpoints ... cd .. tar czf $RUN_DIR.tgz ./$RUN_DIR # recopie sur $HOME mv $RUN_DIR.tgz $OAR_WORKDIR # menage cd .. rm -rf $SCRATCHDIR # suicide avant que LEON s'en occupe! [ -n "$PROGPID" ] && kill -9 $PROGPID SCRIPT_CHECKPOINTED="YES" } # signal Unix attendu par OAR (defaut = SIGUSR1/10, forcé ici # à 12 par le paramètre --signal 12 (cf. param OAR au début) CHKPNT_SIGNAL=12 # valeur de sortie pour l'option "--idempotent" # (restart automatique) ) EXIT_UNFINISHED=99 # indique au script OAR de capter le signal 12 trap sighandler $CHKPNT_SIGNAL # wait indispensable pour maintien des communucations # (signaux) entre ce script et le PROG while kill -0 "$PROGPID" 2>/dev/null; do wait $PROGPID done # important : le code 99 doit être retourné pour que l'option # idempotent ( relance auto.) soit effective [ -n "$SCRIPT_CHECKPOINTED" ] && exit 99 #--------------------------------------------------------- # fin du programme: postraitement #--------------------------------------------------------- # DWTFYW! echo "---post treatement---" # suppression des ckpt (ménage) echo "fin effective du programme, suppression des checkpoints" rm -f ckpt_*.dmtcp dmtcp_restart_script* # a supprimer? mv hostname.txt last_hostname.txt cd .. cp -rp $RUN_DIR $OAR_WORKDIR cd .. rm -rf $SCRATCHDIR # écrasement de la dernière archive intermédiaire par l'originale mv $OAR_WORKDIR/$RUN_DIR.tgz.OAR $OAR_WORKDIR/$RUN_DIR.tgz exit $?