Parcourir la source

mise en place des sources du tutorial calculco pour les checkpoint
- test du fichier chekpoint.md : est-ce qu'un fichier markdow rédigé avec
de fioritures mkdocs-material est lisible/correct dans Gogs?

Philippe Marion il y a 6 ans
Parent
commit
f929091135

+ 6 - 2
README.md

@@ -1,4 +1,8 @@
-- En complément du site https://www-calculco.univ-littoral.fr/utilisation 
+## Tutoriaux Calculco
 
-- Note aux utilisateurs de la plateforme: n'hésitez pas à nous communiquer vos astuces pour abonder ce dépot au bénéfice de tous
+En complément du site https://www-calculco.univ-littoral.fr/utilisation 
+
+## Note aux utilisateurs de la plateforme: 
+
+N'hésitez pas à nous communiquer vos astuces pour abonder ce dépot au bénéfice de tous
 

+ 89 - 0
jobs_longs_checkpoint/checkpoint-dmtcp1.oar

@@ -0,0 +1,89 @@
+#!/bin/bash
+
+#-------------------  CHECKPOINT DMTCP ex1 --------------------------- 
+#
+#  Ce programme met en œuvre le checkpoint via dmtcp de la façon la
+#  plus simple qui soit en utilisant l'option [ -i secondes ] de
+#  dmtcp. les échanges de signaux entre ce script OAR et le programme
+#  sont complètement ignorés, de sorte que l'option «idempotent» d'OAR
+#  est inutile: il n'y a pas de redémarrage automatique. L'utilisateur
+#  doit relancer lui-même relancer ce script. Il peut toutefois être
+#  utile:
+#    - ex1: programme de 200 h, un checkpoint toutes les 24h (au cas où...?)
+#    - ex2: limiter les ressources demandées en prenant le risque d'un
+#      walltime « trop court »: il suffira de relancer à partir d'un
+#      checkpoint. 
+
+# commande: oarsub -S ./checkpoint-dmtcp1.oar
+
+# infos: http://dmtcp.sourceforge.net/
+
+# PRINCIPE:
+#
+#  - le programme est lancé via dmtcp_launch -i x ./PROG, où "x" (secondes)
+#    inférieur au walltime prévu dans l'es paramètre OAR.
+#  - deux cas se présentent:
+#      1) le programme finit dans les temps, très bien.
+#      2) le programme ne finit pas avant le walltime: il suffit de relancer
+#         ce même script qui repartira à partir du checkpoint   
+#  - c'est le cas 2) qui est mis en œuvre ici: timer 4mn /walltime 3mn
+
+#-------------- paramètres OAR---------------------------
+
+# walltime de 6mn ( donc trop court pour le prog/timer de 10mn)
+#OAR -l cpu=1/core=1,walltime=00:3:00 
+#OAR -n dmtcp_ex1
+
+# Les fichiers de sortie sans paramètres $OAR_JOBID
+# (=> les jobs successifs écrivent dans les mêmes fichiers)
+
+#OAR -O OAR-ckpt-dmtcp1.out
+#OAR -E OAR-ckpt-dmtcp1.err
+
+#OAR -q default
+
+# les tests sont mis au point sur orval08.
+# Note: une reprise de checkpoint sur une autre machine nécessite
+# l'édition du script dmtcp_restart_script.sh 
+#OAR -p network_address = 'orval08' 
+
+# optionnel
+#OAR -t besteffort
+
+# chargement du modeul dmtcp
+source /nfs/opt/env/env.sh
+module load dmtcp
+
+#---------- la tâche à exécuter   ------------------------ 
+# compilation (  ) 
+ gcc simpleCompteur4mn.c  -o stimer4mn
+#----------- pré-traitement -----------------------------
+# DWTFYW !
+ 
+
+echo "Debut du jobs ou restart ?"
+
+# si c'est une reprise
+if [ -f dmtcp_restart_script.sh ]; then
+    echo "  -> reprise du job "
+    # piste (changement de nœuds): sed -i '/ancien_noeud/nouveau_noeud/' dmtcp_restart_script.sh
+    # (-> testé -OK- a la mano, à scripter!)
+    ./dmtcp_restart_script.sh 
+else
+    # 1er démarrage avec ordre de checkpoint toutes les 2mn 50 (walltime 3mn) 
+    # Rq: sur un vrai exemple, prendre plus de marge!
+    echo "  -> Debut du jobs"
+    dmtcp_launch -i 170 ./stimer4mn # pas d'éperluette! (&) sinon le script OAR
+                                    # continue et les checkpoint supprimés cf plus bas
+fi
+
+#---------------------------------------------------------
+# fin du programme:  postraitement 
+#---------------------------------------------------------
+# DWTFYW!
+echo "---post treatement---"
+# suppression des ckpt (ménage)
+echo "fin effective du programme, suppression des checkpoints"
+ rm ckpt_*.dmtcp dmtcp_restart_script*
+
+exit $?

+ 124 - 0
jobs_longs_checkpoint/checkpoint-dmtcp2.oar

@@ -0,0 +1,124 @@
+#!/bin/bash
+
+#-------------------  CHECKPOINT DMTCP ex2 --------------------------- 
+#
+#  Ce programme fait suite à l'exemple checkpoint-dmtcp1.oar.
+#  le programme est "trop long", un système de checkpoint/restart
+#  est bienvenu :
+#     - pour tenir dans la  queue "default" ( trop de ressources )
+#     - par sécurité ( ne pas repartir de zéro en cas de ...?
+#     - parce que, contrairement à l'ex. checkpoint-user1.oar, la
+#       gestion du checkpoint au sein du programme utilisateur
+#       (sauvegarde de tout le contexte, est trop compliqué)
+
+# commande: oarsub -S ./checkpoint-dmtcp2.oar
+
+# PRINCIPE:
+# Dans cette exemple, le cycle start/checkpoint/restart jusqu' à la fin
+# du job est automatique:
+#  - le programme est lancé via dmtcp_launch ./PROG
+#  - OAR est lancé avec l'option checkpoint
+#  - le signal checkpoint OAR déclenche le checkpoint de PROG via dmtcp
+# (génère le fichier ckpt_xxxxxxx et le script dmtp_restart_script_.sh)
+#  - l'option idempotent (OAR) relance dmtcp_restart_script.sh
+#  - le tout, autant de fois que nécessaire
+
+# infos: http://dmtcp.sourceforge.net/
+
+#-------------- paramètres OAR---------------------------
+
+# walltime de 6mn ( donc trop court pour le prog/timer de 10mn)
+#OAR -l cpu=1/core=1,walltime=00:6:00 
+#OAR -n dmtcp_ex2
+
+# Les fichiers de sortie sans paramètres $OAR_JOBID
+# (=> les jobs successifs écrivent dans les mêmes fichiers)
+
+#OAR -O OAR-ckpt-dmtcp2.out
+#OAR -E OAR-ckpt-dmtcp2.err
+
+#OAR -q default
+
+# À supprimer (détailler?)
+#OAR -p network_address = 'orval08' 
+
+#OAR -t besteffort
+#OAR -t idempotent
+
+# checkpoint OAR 60 s avant le walltime (donc ~4mn)
+# Pour un exemple réel ( plusieurs heures, gros contexte, 600s (10mn))
+
+#OAR --checkpoint 60
+
+# signal envoyé par OAR (SIGUSR2) 
+#OAR --signal 12 
+
+
+
+# chargement du modeul dmtcp
+source /nfs/opt/env/env.sh
+module load dmtcp
+
+#---------- la tâche à exécuter   ------------------------ 
+# compilation (  ) 
+ gcc simpleCompteur10mn.c  -o stimer10mn
+#----------- pré-traitement -----------------------------
+# DWTFYW !
+
+echo "Debut du jobs ou restart ?"
+
+# lancement du programme, récupération du PID
+if [ -f dmtcp_restart_script.sh ]; then
+    echo "  -> reprise du job "
+    ./dmtcp_restart_script.sh &
+    PROGPID=$!    
+else
+    echo "  -> Debut du jobs"
+    dmtcp_launch ./stimer10mn &
+    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
+    [ -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
+rm ckpt_*.dmtcp dmtcp_restart_script*
+# => idempotent devrait entraîner un redémarrage auto.
+exit $?

+ 118 - 0
jobs_longs_checkpoint/checkpoint-user1.oar

@@ -0,0 +1,118 @@
+#!/bin/bash
+
+#-------------------  CHECKPOINT  --------------------------- 
+#
+#  exemple de programme "trop long" qui utilise la fonctionnalité
+#  "checkpoint" d'OAR, suivi de reprise(s) automatique(s)
+#  (fonctionnalité idempotent) ... jusqu' à la fin du programme 
+
+# commande: oarsub -S ./checkpoint-user1.oar
+
+# Cet exemple est arrêté 2 fois ( 3 jobs consécutifs pour finir)
+
+#
+#  IMPORTANT:
+#  Ce script OAR capte bien le signal  de  checkpoint envoyé par
+#  OAR, envoit un signal (à adapter éventuellement) au programme de
+#  de l'utilisateur, MAIS c'est LE PROGRAMME de l'utilisateur qui
+#  doit capter et interpréter ce signal ... afin de sauver le
+#  "contexte" de son execution de sorte qu'au remédérrage
+#  automatique ( - t idempotent ), il ne reprenne pas du début
+#  ( sinon il y a une boucle infinie !)
+#
+#  Le programme associé à ce script est un simple compteur
+#   ( 1 incrémentation / secondes ) en C.
+#   - son excécution dur 10 mn
+#   - ce script OAR, pour l'exemple, ne prévoit que 5mn (trop court!) 
+#   - le script OAR reçoit (d'OAR) le signal checkpoint 12.
+#     Il renvoit le signal 2 (SIGINT) au programme timer
+#   - À réception de ce dernier (interruption) le timer sauve
+#     aussitôt son contexte (le n° d'itération) dans un fichier local. 
+#   - timer10mn est arrêté mais est relancé par OAR
+# 
+#-------------- paramètres OAR---------------------------
+#OAR -l cpu=1/core=1,walltime=00:5:00 
+#OAR -n start_and_restart
+
+# Les fichiers de sortie sans paramètres $OAR_JOBID
+# (=> les jobs successifs écrivent dans les mêmes fichiers)
+#OAR -O OAR-ckpt-user1.out
+#OAR -E OAR-ckpt-user1.err
+
+#OAR -q default
+
+#IMPORTANT:
+#   - par NFS: a priori pas de problème
+#   - sur SCRATCH : il faut reprendre sur la même machine
+#  par exemple : 
+#OAR -p network_address = 'orval08' 
+## besteffort est optionnel 
+#OAR -t besteffort
+## idempotent ne l'est pas 
+#OAR -t idempotent
+
+# checkpoint 60 s avant le walltime: pour un exemple
+# réel ( plusieurs heures, gros contexte, 600 (10mn))  
+#OAR --checkpoint 60
+# signal envoyé par OAR (SIGUSR2) 
+#OAR --signal 12 
+
+
+#---------- la tâche à exécuter   ------------------------ 
+# compilation ( peut être commenté si déjà compilé) 
+gcc compteur10mn.c  -o timer10mn
+# Note (compteur10mn.c): gère son propre checkpoint (SIGINT)
+#----------- pré-traitement -----------------------------
+# DWTFYW !
+echo "Debut du job ${OAR_JOB_ID}"
+
+#----------- lancement de la tâche ----------------------
+./timer10mn &
+
+#---------------------------------------------------------
+# gestion de signaux
+#---------------------------------------------------------
+# Warning: c'est le script OAR qui reçoit le signal 12!
+#  => il faut le capter et le transmettre au PROG
+####################################################
+
+# pid du programme = pid de la dernière commande (: ./timer10mn)
+
+PID=$!
+
+# 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
+
+# si le script OAR reçoit le SIGUSR2 (signal 12), checkpoint!
+
+# Rq tentative d'envoyer le même signal au prog: ne fonctione pas!?
+# SIGUSR2 = 12 kill rééllement le programme :
+#   => pas de checkpoint
+#   => boucle infinie!
+
+# Du coup: 
+# SIGINT = 2 = "CRTL + C" fonctionne 
+trap "echo commande trap (script OAR); kill -s 2 $PID ; exit $EXIT_UNFINISHED" $CHKPNT_SIGNAL
+#
+
+# obliger le script OAR à attendre l'exécution du PROG
+# (sinon il s'exécute jusqu'au bout et ne récupérera
+# jamais le signal checkpoint !)
+
+wait $PID
+
+#---------------------------------------------------------
+# fin du programme:  postraitement
+#---------------------------------------------------------
+# DWTFYW!
+echo " ---post treatement---"
+echo " ...suppression du fichier temporaire context_compteur.txt"
+rm -f context_compteur.txt
+echo " c'est FINI ! "
+# => idempotent devrait entraîner un redémarrage auto.
+exit $?

Fichier diff supprimé car celui-ci est trop grand
+ 522 - 0
jobs_longs_checkpoint/checkpoint.md


+ 13 - 0
jobs_longs_checkpoint/compteur.c

@@ -0,0 +1,13 @@
+#include <stdio.h>
+#include <unistd.h>
+int main( int argc, char *argv[] )
+{
+    int i;
+    int max=60; /*10 minutes (environ: ce n'est pas un chrono!)*/
+    for (i=0; i<=max; i++)
+    {
+         printf("i = %d0s\n", i);
+         fflush(stdout);
+         sleep(10);
+     }
+}

+ 7 - 0
jobs_longs_checkpoint/compteur.m

@@ -0,0 +1,7 @@
+i=1;
+max=60;
+while i < max
+  fprintf(" i = %d \n",i);
+  i = i + 1;
+  pause(10);
+end

+ 11 - 0
jobs_longs_checkpoint/compteur.py

@@ -0,0 +1,11 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import time
+
+i=0
+max=60
+while i < max:
+    print "i = %d0s" % i
+    time.sleep(10)
+    i = i + 1

+ 94 - 0
jobs_longs_checkpoint/compteur10mn.c

@@ -0,0 +1,94 @@
+#include <stdio.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>  //sleep
+
+
+/*
+ - compteur sur 10 mn (affichage incrementations toutes les secondes)
+ - capture de signaux ( pour test de checkpointing avec dmtcp /OAR Caclculco)
+ - le compteur est sauvegardé dans un fichier sur capture de signal (SIGINT /2)
+     -> à réutiliser pour reprise de travaux après checkpointing ) 
+ */
+#define SIZE 1
+#define NUMELEM 5
+
+/*compteur  variable globale ( main et signal ) */
+int compteur;
+//findice_ckpt
+FILE * fp;
+
+
+void sig_handler(int signal)
+{
+switch (signal)
+  {
+  case SIGINT:
+    // code exécuté si on reçoit SIGINt (CTRL+C);        
+    printf("SIGINT recu (programme C)\n");
+    printf("valeur du compteur enregistre: %d\n", compteur);
+    // fichier de sauvegarde du "contexte" ( l'indice = nb de secondes!
+    fp = fopen("context_compteur.txt", "wb");
+    if(fp == NULL) {
+        printf("error creating file");
+    }
+    else {
+      fwrite( &compteur , sizeof(int) , 1 , fp);
+      fclose(fp);
+    }
+    break;
+
+  case SIGUSR2:        
+    // code normalement exécuté si on reçoit SIGUSR2 (OAR?) ou SIGUSR1 (dmtcp);
+    // NE FONCTIONNE PAS ( c'est donc le SIGINT 2 ci- dessus qui est utlisé dans
+    // checkpoint-user1.oar
+    printf("signal checkpoint de dmtcp recu \n");
+     printf("valeur du compteur: %d\n", compteur);
+    fp = fopen("context_compteur.txt", "wb");
+    if(fp == NULL) {
+        printf("error creating file");
+    }
+    else {
+      fwrite( &compteur , sizeof(int) , 1 , fp);
+      fclose(fp);
+    }
+
+    break;
+
+    default :
+    // sortie
+    exit(0);
+  }
+}
+
+
+//int main( int argc, char *argv[] )
+int main(void)
+{
+  if (signal(SIGINT, sig_handler) == SIG_ERR)
+    printf("\n ne peut pas recevoir SIGINT\n");
+
+  // ----- test si un checkpoint existe ---- 
+  // si oui, lecture de la valeur dans le fichier
+  int i ;
+  fp = fopen("context_compteur.txt", "rb");
+  if (fp){
+    fread( &i , sizeof(int) , 1 , fp);
+    printf("valeur compteur au precedent checkpoint = %d\n", i);
+    fclose(fp);
+  }else{
+    i=0;
+  }
+  // ---- le Compteur propremen dit ---------
+  // 10 mn(environ: ce n'est pas un chrono!)
+  
+  for (compteur=i; compteur <=600; compteur++)
+    {
+      printf("compteur = %d\n", compteur);
+      // force l'écriture sur la sortie
+      fflush(stdout);
+      sleep(1);
+    }
+  return 0;
+}

+ 13 - 0
jobs_longs_checkpoint/simpleCompteur10mn.c

@@ -0,0 +1,13 @@
+#include <stdio.h>
+#include <unistd.h>  //sleep
+int main( int argc, char *argv[] )
+{
+    int i;
+    int max=600; /* 10mn (environ: ce n'est pas un chrono!)*/
+    for (i=0; i<=max; i++)
+    {
+         printf("i = %d\n", i);
+         fflush(stdout);
+         sleep(1);
+     }
+}

+ 13 - 0
jobs_longs_checkpoint/simpleCompteur4mn.c

@@ -0,0 +1,13 @@
+#include <stdio.h>
+#include <unistd.h>  //sleep
+int main( int argc, char *argv[] )
+{
+    int i;
+    int max=240; /* 4mn (environ: ce n'est pas un chrono!)*/
+    for (i=0; i<=max; i++)
+    {
+         printf("i = %d\n", i);
+         fflush(stdout);
+         sleep(1);
+     }
+}