Jak zmierzyć w Linuksie szczytową pamięć aplikacji po zakończeniu

11

Jak zmierzyć maksymalną pamięć aplikacji działającej w systemie Linux?

Korzystam z tej aplikacji wsadowo, więc nie mogę korzystać z RSS, ponieważ raportuje bieżącą pamięć. Potrzebuję pamięci szczytowej, którą aplikacja zgłosiła na końcu.

VmPeak też nie jest rozwiązaniem, ponieważ zgłasza przydzieloną pamięć, a także nie oblicza z rzeczywistego pamięci RAM, ale także z dysku twardego.

des_user
źródło
Na jakim systemie operacyjnym uruchamiasz aplikację?
CVn
Pracuję na systemie Linux
des_user
Ten wątek powinien ci pomóc: serverfault.com/questions/387268
Jacob Coleman

Odpowiedzi:

13

Oto 2 metody śledzenia szczytowego wykorzystania pamięci procesów.

Syrop

Nie korzystałem z tego narzędzia, ale wygląda na to, czego szukasz. To się nazywa Syropy .

Opis

Syrupy to skrypt w języku Python, który regularnie wykonuje migawki pamięci i obciążenia procesora jednego lub większej liczby uruchomionych procesów, aby dynamicznie budować profil wykorzystania zasobów systemowych.

Przykład

$ syrupy.py myprog

  PID DATE        TIME     ELAPSED  CPU   MEM    RSS   VSIZE
14634 2008-10-10  20:45:25   00:00  0.0   0.0   2996    6680
14634 2008-10-10  20:45:26   00:01  105   0.2   7804   12592
14634 2008-10-10  20:45:27   00:02  103   0.2   8996   13776
14634 2008-10-10  20:45:28   00:03  103   0.2  10468   15348
14634 2008-10-10  20:45:29   00:04  103   0.3  11412   16396
14634 2008-10-10  20:45:30   00:05  104   0.3  12492   17444

/usr/bin/time -v

Tak, jak na ironię, polecenie czasu GNU może zapewnić maksymalne wykorzystanie pamięci przez proces. Donosi, że pamięć szczytową tak: Maximum resident set size (kbytes).

Przykład

$ /usr/bin/time -v ~/projects/prime_numbers/eratosthenes_prime_sieve.pl 10 1000000
...

    Command being timed: "/home/saml/projects/prime_numbers/eratosthenes_prime_sieve.pl 10 1000000"
    User time (seconds): 1.12
    System time (seconds): 0.05
    Percent of CPU this job got: 54%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:02.19
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 79304
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 20014
    Voluntary context switches: 83
    Involuntary context switches: 274
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

Bibliografia

slm
źródło
3

Chociaż temat jest dość stary, chcę udostępnić inny projekt, który powstał z funkcji jądra Linuksa cgroups.

https://github.com/gsauthof/cgmemtime :

cgmemtime mierzy zużycie wody w pamięci RSS + CACHE przez proces i jego procesy potomne.

Aby móc to zrobić, umieszcza proces we własnej grupie cg.

Na przykład proces A przydziela 10 MiB i uruchamia podrzędne dziecko B, które przydziela 20 MiB i które uruchamia podrzędne dziecko C, które przydziela 30 MiB. Wszystkie trzy procesy dzielą okno czasowe, w którym ich alokacja skutkuje odpowiednim użyciem pamięci RSS (rozmiar zestawu rezydentnego).

Pytanie brzmi: ile pamięci faktycznie jest używane w wyniku uruchomienia A?

Odpowiedź: 60 MiB

cgmemtime to narzędzie do odpowiedzi na takie pytania.

Przykłady użycia to:

$ sudo ./cgmemtime --setup -g <myusergroup> --perm 775

$ ./cgmemtime ./testa x 10 20 30
Parent PID is 27189
Allocating 10 MiBs
New Child: 27193
Allocating 20 MiBs
New Child: 27194
Allocating 30 MiBs
Child user:    0.000 s
Child sys :    0.005 s
Child wall:    6.006 s
Child high-water RSS                    :      11648 KiB
Recursive and acc. high-water RSS+CACHE :      61840 KiB

$ ./cgmemtime python -c 'print range(100000)[48517]'
48517
Child user:    0.014 s
Child sys :    0.014 s
Child wall:    0.029 s
Child high-water RSS                    :       9948 KiB
Recursive and acc. high-water RSS+CACHE :       5724 KiB
Vlad Frolov
źródło
Jak zatem można użyć tego narzędzia do zgłaszania szczytowego użycia pamięci RAM programu po jego zamknięciu ?
terdon
@terdon Wykorzystuje wait4do wychodzenia z zakończenia procesu w połączeniu z cgroups ( memory.max_usage_in_bytes), co wydaje się mieć sens. Więcej informacji jest dostępnych w pliku README na github.
Vlad Frolov
Dzięki, ale moja uwaga dotyczyła raczej twojej odpowiedzi. W obecnej formie nie odpowiada na pytanie, wskazuje jedynie na niektóre zasoby zewnętrzne, które mogą być w stanie. Ponadto opublikowałeś dokładnie tę samą odpowiedź w innym miejscu, co podnosi automatyczną flagę. Edytuj swoją odpowiedź i dołącz przykład pokazujący, jak ten program może robić to, o co prosi OP.
terdon
2
@terdon Tak, zrobiłem to! Ponieważ szukałem tego samego pytania, a pytania są prawie takie same, a odpowiedzi są takie same: „parsuj wyjście ps”, co jest szalone! Spędziłem tydzień przed przypadkowym wpadnięciem na projekt cgmemtime, który idealnie pasuje do wszystkich tych pytań, które skomentowałem!
Vlad Frolov
1
Słusznie. Byłoby po prostu świetnie, gdybyś mógł podać przykład, w jaki sposób można go użyć. Poprawiłoby to twoją odpowiedź. W każdym razie, dzięki za poświęcenie czasu na opublikowanie tego, jestem pewien, że inni uznają to za przydatne.
terdon