Wywołaj i śledź zużycie pamięci jednego procesu

14

Chcę uruchomić program zajmujący pamięć i śledzić zużycie pamięci w czasie. Program kończy się w kilka sekund po wywołaniu.

To poprzednie pytanie sugerowało pakiet sysstat . Chociaż jego pidstatużyteczność częściowo spełnia moje oczekiwania, nie spełnia moich 2 potrzeb:

  • Przyjmuje minimalny odstęp 1s, ale chcę mierzyć przy mniejszej ziarnistości. ( 0.1spowinno być w porządku)
  • Śledzi tylko istniejący proces, podczas gdy nie zawsze mogę być obecny, aby skopiować i wkleić pid.

Czy istnieją jakieś alternatywne skrypty / narzędzia, które lepiej wykonują zadanie wywoływania i mierzenia?

Jokester
źródło
1
Wygląda na to, że powinieneś napisać sobie prosty skrypt w języku Python lub Bash, aby zrzucić zużycie pamięci procesu (możesz po prostu wyświetlić pierwszą liczbę całkowitą /proc/$PID/statm), a następnie spać przez 100 ms i powtórzyć. Dlaczego nie można po prostu zachować rzucanie PID związany statmprzez cat, może korzystać z niektórych regex odsączyć / wartości dodatkowych niepotrzebnych, a po prostu zrobić sleep 0.01? Niektóre systemy operacyjne nie zezwalają na sleepwartości w sekundach, więc w takim przypadku musisz wybrać trasę w Pythonie ( timezamiast tego użyć wbudowanej biblioteki Pythona do uśpienia).
Przełom
jest wiele sposobów
munish

Odpowiedzi:

11

To powinno zrobić to, czego potrzebujesz. Pobiera informacje /proc/$PID/statmi drukuje (z 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

Scenariusz:

#!/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

Następnie możesz wywołać skrypt, nadając mu nazwę procesu jako dane wejściowe. Na przykład:

$ 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

UWAGI:

  • Zakłada się, że istnieje tylko jeden uruchomiony proces o określonej nazwie.
terdon
źródło
@ björnen dziękuję za edycję. Masz rację, pomyliłem się man, nie wiem, dlaczego twoja edycja została odrzucona.
terdon
1

Po latach odkryłem, że valgrind (także) ma do tego narzędzie:

# 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

Uwaga: valgrind robi więcej niż obserwowanie: musi wstrzyknąć trochę kodu i zrobić migawkę pamięci. Może to zaszkodzić precyzji statystyk.

Jokester
źródło