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

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().


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

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.