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