Jak rejestrować użycie pamięci i procesora przez aplikację?

16

Podobne do pytania Jak zalogować obciążenie procesora? , Chciałbym zapisać pamięć procesu.

Proces, który chcę zarejestrować, jest zabijany na zdalnym serwerze i chcę sprawdzić obciążenie procesora oraz zużycie pamięci tuż przed jego zabiciem.

[aktualizacja]

Zarówno schludny mały skrypt Pythona Stefano Palazzo, jak i

Jednowierszowe wartości wyjściowe Michała, które są mniejsze niż topdla CPU i Mem. Masz pomysł dlaczego?

moc wyjściowa:

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND 
2312 schXX     20   0 1241m 328m  58m S  100  0.3  11:56.68 MATLAB 

wypisuje skrypt Pythona Stefano Palazzo:

python memlogger.py 2312
%CPU    %MEM
76.00   0.20
76.00   0.20
Framester
źródło
Niestety nie mogę tutaj jeszcze komentować, ale ten interesujący Cię post psmoże wyjaśniać, dlaczego może się różnić od top: stackoverflow.com/questions/131303/...
PM

Odpowiedzi:

16

Możesz utworzyć jednowarstwowy w powłoce:

logpid() { while sleep 1; do  ps -p $1 -o pcpu= -o pmem= ; done; }

aby zarejestrować proces przy pomocy pid = 123 wystarczy:

logpid 123

lub aby zobaczyć i zapisać dziennik do pliku:

logpid $$ | tee /tmp/pid.log

Jeśli chcesz rejestrować inne dane, zmień -o {this}opcje. Informacje man psna temat dostępnych parametrów można znaleźć w sekcji „STANDARDOWE SPECYFIKATORY FORMATU”. Jeśli chcesz mieć inną rozdzielczość czasową, zmień sleep {this}funkcję logpid().

Michał Šrajer
źródło
Prosty i działa!
rafaelbattesti
3

Jeśli dokładnie śledzisz topstatystyki, możesz uruchomić topw trybie wsadowym, określając pid procesu, którego szukasz. Biorąc przykład z tej strony ( http://www.dedoimedo.com/computers/linux-cool-hacks.html ), jeśli wpiszesz

top -b -d 10 -n 3 >> top-file

Będziesz mieć „top działający w trybie wsadowym (-b). Będzie odświeżał się co 10 sekund, zgodnie z flagą opóźnienia (-d), dla całkowitej liczby 3 iteracji (-n). Wyjście zostanie wysłane do pliku. ” W tym -pmożesz określić pidproces, którego szukasz. To oczywiście zwróci więcej niż tylko procesor i pamięci RAM, ale będzie zawierało te pola. W moim przypadku na przykład dostałbym następujące informacje podczas monitorowania pid 9189 przy użyciu top -b -d 10 -n 3 -p 9189 >> ~/top-file:

PID  USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
9189 pmj27     20   0 1617016 808112  27916 S   0.0  0.3   1:36.63 gedit
PO POŁUDNIU
źródło
Ta strona, chociaż nie powoduje przekierowań do pliku, wprowadza kilka bardziej wyrafinowanych modyfikacji, pozwalając uzyskać tylko wydrukowany procesor. Jeśli ktoś zna dobry sposób na przekierowanie danych wyjściowych do pliku i okresową aktualizację, byłbym zainteresowany. watchnie wydaje mi się idealny do tego: superuser.com/questions/281347/filtering-top-command-output
PM
2

Ten prosty skrypt Pythona powinien robić, co chcesz:

import time
import string
import sys
import commands

def get_cpumem(pid):
    d = [i for i in commands.getoutput("ps aux").split("\n")
        if i.split()[1] == str(pid)]
    return (float(d[0].split()[2]), float(d[0].split()[3])) if d else None

if __name__ == '__main__':
    if not len(sys.argv) == 2 or not all(i in string.digits for i in sys.argv[1]):
        print("usage: %s PID" % sys.argv[0])
        exit(2)
    print("%CPU\t%MEM")
    try:
        while True:
            x,y = get_cpumem(sys.argv[1])
            if not x:
                print("no such process")
                exit(1)
            print("%.2f\t%.2f" % (x,y))
            time.sleep(0.5)
    except KeyboardInterrupt:
        print
        exit(0)

Najpierw musisz znaleźć identyfikator procesu programu, który chcesz monitorować, a następnie możesz uruchomić skrypt z PID jako argumentem:

python log.py 3912

Wydrukuje użycie procesora i użycie pamięci RAM w procentach dwa razy na sekundę:

%CPU    %MEM
0.90    0.40
1.43    0.40
8.21    0.40
...

Następnie możesz przekierować dane wyjściowe do pliku, aby później zaimportować go do arkusza kalkulacyjnego ( python log.py 9391 > firefox_log.txt) i zaimportować dane do arkusza kalkulacyjnego, wybierając Tabjako separator.

Program kończy pracę, gdy naciśniesz Ctrl + C lub gdy proces zostanie zabity.

Stefano Palazzo
źródło
Drogi Stefano, bardzo dziękuję za scenariusz. Niestety wydaje się, że wyniki są nieprawidłowe. Czy masz pojęcie dlaczego? Zobacz moje zaktualizowane pytanie.
Framester
Na stronie ps man man7.org/linux/man-pages/man1/ps.1.html ps wypisuje „wykorzystany czas procesora podzielony przez czas, w którym proces był uruchomiony (stosunek wydajności do czasu rzeczywistego), wyrażony w procentach „- więc otrzymujesz średnie zużycie procesora od momentu uruchomienia
Nicolas Charles