Invoquer et suivre l'utilisation de la mémoire d'un processus


14

Je veux exécuter un programme consommateur de mémoire et suivre son utilisation de la mémoire au fil du temps. Le programme se termine en quelques secondes après avoir été appelé.

Cette question précédente suggérait le paquet sysstat . Bien que son pidstatutilitaire fasse en partie ce que je veux, il ne répond pas à mes 2 besoins:

  • Il accepte un intervalle minimal de 1s, mais je veux mesurer à une granularité plus courte. ( 0.1sça devrait aller)
  • Il ne fait que suivre un processus existant, alors que je ne peux pas toujours être présent pour copier et coller le pid.

Existe-t-il des scripts / utilitaires alternatifs pour mieux effectuer le travail d'invocation et de mesure?


1
On dirait que vous devriez vous écrire un petit script Python ou Bash simple pour vider l'utilisation de la mémoire du processus (vous pouvez simplement afficher le premier entier /proc/$PID/statm), puis dormir pendant 100 ms et répéter. Pourquoi ne pouvez - vous garder juste jeter associé de la PID statmpar cat, peut - être utiliser certains regex pour filtrer les valeurs supplémentaires / non nécessaires, et faire juste un sleep 0.01? Certains systèmes d'exploitation n'autorisent pas les sleepvaleurs inférieures à une seconde , dans ce cas, vous devrez emprunter la route Python (et utiliser la timebibliothèque intégrée de Python pour dormir à la place).
Percée du

il y a plusieurs façons
munish

Réponses:


11

Cela devrait faire ce dont vous avez besoin. Il obtient les informations /proc/$PID/statmet imprime (de man procfs):

              size       total program size
                         (same as VmSize in /proc/[pid]/status)
              resident   resident set size
                         (same as VmRSS in /proc/[pid]/status)
              share      shared pages (from shared mappings)
              data       data + stack

Le script:

#!/usr/bin/env bash 

## Print header
 echo -e "Size\tResid.\tShared\tData\t%"
 while [ 1 ]; do
    ## Get the PID of the process name given as argument 1
     pidno=`pgrep $1`
    ## If the process is running, print the memory usage
     if [ -e /proc/$pidno/statm ]; then
     ## Get the memory info
      m=`awk '{OFS="\t";print $1,$2,$3,$6}' /proc/$pidno/statm`
     ## Get the memory percentage
      perc=`top -bd .10 -p $pidno -n 1  | grep $pidno | gawk '{print \$10}'`
     ## print the results
      echo -e "$m\t$perc";
    ## If the process is not running
     else
      echo "$1 is not running";
     fi
 done

Vous pouvez ensuite appeler le script en lui donnant un nom de processus en entrée. Par exemple:

$ memusage.sh firefox
Size    Resid.  Shared  Data    %
517193  261902  9546    400715  12.8
517193  261902  9546    400715  12.8
517193  261902  9546    400715  12.8
517193  262100  9546    400715  12.8
517193  262100  9546    400715  12.8
517193  262100  9546    400715  12.8
517209  261899  9546    400731  12.8
517209  261899  9546    400731  12.8

REMARQUES:

  • Cela suppose qu'il n'y a qu'un seul processus en cours d'exécution avec le nom spécifié.

@ björnen merci pour la retouche. Vous avez tout à fait raison, j'ai eu tort manlà-bas, je ne sais pas pourquoi votre montage a été rejeté.
terdon

1

Après des années, j'ai trouvé que valgrind avait (également) un outil pour cela:

# record memory usage

$ valgrind --tool=massif bash -c "sleep 5; echo hey";
==5281== Massif, a heap profiler
==5281== Copyright (C) 2003-2015, and GNU GPL'd, by Nicholas Nethercote
==5281== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==5281== Command: bash -c sleep\ 5;\ echo\ hey
==5281==
hey
==5281==

# print the usage (5281 was the pid of bash, your filename will be different)
$ ms_print massif.out.4682

Remarque: valgrind fait plus qu'observer: il doit injecter du code et prendre un instantané de la mémoire. Cela peut nuire à la précision des statistiques.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.