Mémoire utilisée par un job terminé

      Commentaires fermés sur Mémoire utilisée par un job terminé

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)