|
@@ -0,0 +1,191 @@
|
|
|
|
+#!/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 $?
|