web-dev-qa-db-fra.com

Commande Unix pour dire combien RAM a été utilisé pendant l'exécution du programme?

Supposons que j'exécute un script (par exemple en Python). Afin de savoir combien de temps le programme prenait, on exécuterait

time python script1.py

Existe-t-il une commande qui garde la trace de la quantité RAM a été utilisée pendant l'exécution du script? Pour trouver la quantité RAM est disponible, on pourrait utiliser free, mais cette commande ne correspond pas à la tâche ci-dessus.

37
ShanZhengYang

La commande time (1) (vous devrez peut-être l'installer - peut-être comme le package time-, elle devrait être dans /usr/bin/time) Accepte de nombreux arguments, y compris un chaîne de format (avec -f ou --format) qui comprend (entre autres)

  %M     Maximum resident set size of the process during its lifetime,
          in Kbytes.

  %K     Average total (data+stack+text) memory use of the process, in
          Kbytes.

Ne confondez pas la commande /usr/bin/time Avec le timebash builtin . Vous devrez peut-être taper le chemin d'accès complet au fichier /usr/bin/time (Pour demander à votre shell d'exécuter la commande et non le module intégré) ou tapez command time Ou \time (merci à Toby Speight & Arrow pour leurs commentaires).

Vous pouvez donc essayer (RSS étant le taille de l'ensemble résident )

/usr/bin/time -f "mem=%K RSS=%M elapsed=%E cpu.sys=%S .user=%U" python script1.py

Vous pouvez également essayer

/usr/bin/time --verbose  python script1.py

Vous demandez:

combien RAM a été utilisé pendant l'exécution du script?

et cela montre une idée fausse de votre part. Les programmes d'application exécutés sous Linux (ou tout système d'exploitation multi-processus moderne) utilisent mémoire virtuelle , et chaque processus (y compris le processus python exécutant votre script ) a son propre espace d'adressage virtuel . Un processus ne s'exécute pas directement dans physique RAM, mais possède son propre espace d'adressage virtuel (et y fonctionne), et le noyau implémente la mémoire virtuelle par des techniques sophistiquées pagination à la demande utilisant des techniques paresseuses copie sur écriture et configure les MMU . Le BÉLIER est un périphérique physique et une ressource utilisée -et gérée en interne par le noyau- pour implémenter la mémoire virtuelle (lire aussi sur le cache de page et sur thrashing ).

Vous voudrez peut-être passer plusieurs jours à mieux comprendre systèmes d'exploitation . Je recommande de lire Systèmes d'exploitation: trois pièces faciles qui est un livre téléchargeable gratuitement. Le RAM est utilisé par l'ensemble du système d'exploitation (pas -directement- par des processus individuels) et les pages réelles de RAM pour un processus donné peuvent varier dans le temps) (et pourrait être partagé d'une manière ou d'une autre avec d'autres processus.) Par conséquent, la consommation de RAM d'un processus donné n'est pas bien définie car elle change constamment (vous pouvez vouloir sa moyenne ou sa valeur de crête, etc.). ...), et de même pour la taille de son espace d'adressage virtuel.

Vous pouvez également utiliser (surtout si votre script s'exécute pendant plusieurs secondes) l'utilitaire top (1) (peut-être dans un autre terminal), ou ps (1) ou - pmap (1) -peut-être utiliser watch (1) pour répéter cette commande ps ou pmap. Vous pouvez même utiliser directement /proc/ (Voir proc (5) ...) peut-être comme watch cat /proc/$(pidof python)/status ou /proc/$(pidof python)/stat ou /proc/$(pidof python)/maps etc...

Mais l'utilisation de la RAM (par le noyau pour certains processus) est largement varie avec le temps pour un processus donné (et même son espace d'adressage virtuel change, par exemple par des appels à mmap (2) et munmap utilisé par - ld-linux (8) , dlopen (3) , malloc (3) & free et de nombreuses autres fonctions nécessaires à votre Python interprète ...).

Vous pouvez également utiliser strace (1) pour comprendre les appels système effectués par Python pour votre script (afin que vous compreniez comment il utilise mmap & munmap et autres appels système (2) ). Vous pouvez restreindre strace avec -e trace=%memory ou -e trace=memory pour obtenir uniquement les appels système liés à la mémoire (c'est-à-dire l'espace d'adressage virtuel).

BTW, la fonction tracemalloc Python pourrait également être utile.

Je suppose que vous seulement vous souciez du virtuel mémoire, qui concerne l'espace d'adressage virtuel (mais pas la RAM), utilisé par l'interpréteur Python pour exécuter votre script Python. Et c'est changer pendant l'exécution du processus. Le RSS (ou la taille maximale maximale de l'espace d'adressage virtuel) pourrait en fait être plus utile à connaître.

Voir aussi LinuxAteMyRAM .

52

Vous pouvez également utiliser le légendaire valgrind , mais vous devrez peut-être l'installer à partir de votre gestionnaire de paquets.

$ valgrind c-projects/objtest/bin/objtest 
==6543== Memcheck, a memory error detector
==6543== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==6543== Using Valgrind-3.12.0.SVN and LibVEX; rerun with -h for copyright info
==6543== Command: c-projects/objtest/bin/objtest
==6543== 
|ERROR|array:189: array_delete: delete index 0 but the highest is -1 (delete from empty array): index out of bounds
==6543== 
==6543== HEAP SUMMARY:
==6543==     in use at exit: 480 bytes in 20 blocks
==6543==   total heap usage: 7,390 allocs, 7,370 frees, 256,217 bytes allocated
==6543== 
==6543== LEAK SUMMARY:
==6543==    definitely lost: 96 bytes in 4 blocks
==6543==    indirectly lost: 384 bytes in 16 blocks
==6543==      possibly lost: 0 bytes in 0 blocks
==6543==    still reachable: 0 bytes in 0 blocks
==6543==         suppressed: 0 bytes in 0 blocks
==6543== Rerun with --leak-check=full to see details of leaked memory
==6543== 
==6543== For counts of detected and suppressed errors, rerun with: -v
==6543== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

Si vous êtes un utilisateur expérimenté et que vous voulez des graphiques fantaisistes, vous pouvez utiliser ms_print et une commande comme:

valgrind --tool=massif --pages-as-heap=yes --massif-out-file=massif.out ./test.sh; grep mem_heap_B massif.out | sed -e 's/mem_heap_B=\(.*\)/\1/' | sort -g | tail -n 1

voir tilisation maximale de la mémoire d'un processus linux/unix .

17
cat

Vous pouvez utiliser la commande pmap pour afficher la quantité de mémoire utilisée par un processus. Dans votre cas, vous devez donner le PID du script comme entrée à la commande pmap comme

pmap $(ps -ef | grep **<SCRIPT NAME>** | grep -v grep | awk '{print $2}')

2
upkar