Mémoire utilisée par un job terminé
- Vérification à posteriori de la mémoire
 
$> sacct -o jobid,reqnodes,reqcpus,reqmem,maxrss,averss,elapsed -j JOBID
#reqmem : RAM demandée via sbatch
#maxrss : RAM maximale utilisée
#averss : RAM moyenne utilisée
- Dans l’exemple suivant, le job a utilisé 105Gos de RAM.
 
$> sacct -o jobid,reqnodes,reqcpus,reqmem,maxrss,averss,elapsed -j 94079
       JobID ReqNodes  ReqCPUS     ReqMem     MaxRSS     AveRSS    Elapsed
------------ -------- -------- ---------- ---------- ---------- ----------
94079               1        1      125Gn                         00:10:20
94079.batch         1        1      125Gn 105823148K 105823148K   00:10:27
- Cependant, la mesure n’est pas forcément fiable.
 
- Voici un programme python avec lequel on a lancé un job. Ce programme utilise 3Gos de RAM.
 
- Ce programme dure 1 min (avec sleep(60))
 
import psutil
import time
import numpy as np
arr=np.ones((1024,1024,1024,3), dtype=np.uint8)
print(psutil.Process().memory_info().rss / (1024*1024))
time.sleep(60)
- L’analyse donnée par la commande sacct est ici correcte.
 
- The analysis given by the command sacct is here correct.
 
$> sacct -o jobid,reqnodes,reqcpus,reqmem,maxrss,averss,elapsed -j 703201
       JobID ReqNodes  ReqCPUS     ReqMem     MaxRSS     AveRSS    Elapsed 
------------ -------- -------- ---------- ---------- ---------- ---------- 
703201              1        1       60Gn                         00:01:06 
703201.batch        1        1       60Gn   3172208K   3172208K   00:01:06 
- Si le temps d’exécution est trop court, le scheduler ne donne pas une analyse correcte de la mémoire réellement utilisée.
 
- Le programme est presqu’exactement le même. Il utilise bien 3Gos de RAM mais ne dure que 10 secondes (avec sleep(10))
 
import psutil
import time
import numpy as np
arr=np.ones((1024,1024,1024,3), dtype=np.uint8)
print(psutil.Process().memory_info().rss / (1024*1024))
time.sleep(10)
- Cependant, l’analyse a posteriori donnée par la commande sacct est ici erronée.
 
$> sacct -o jobid,reqnodes,reqcpus,reqmem,maxrss,averss,elapsed -j 703202
       JobID ReqNodes  ReqCPUS     ReqMem     MaxRSS     AveRSS    Elapsed 
------------ -------- -------- ---------- ---------- ---------- ---------- 
703202              1        1       60Gn                         00:00:11 
703202.batch        1        1       60Gn      1484K      1484K   00:00:11 
Python
- Pour surveiller la mémoire utilisée par un processus en Python, on peut utiliser le code suivant :
 
- To monitor the memory used by a process in Python, we can use the following code:
 
import psutil
# ...
psutil.Process().memory_info().rss / (1024*1024)
- La division par 1024*1024 donne une valeur en Go.
 
- Voici un morceau de code Python pour surveiller la mémoire utilisée à un instant par le processus proc.
 
while proc.poll() is None:
    rss = psutil.Process(proc.pid).memory_info().rss
    proc.wait(timeout)
- Le paramètre timeout définie les pas de temps entre lesquels vous faites des mesures
 
- Documentation