2009-07-03 11 views
7

Jak monitorować pamięć szczytową zużywaną przez proces w systemie Linux? To nie jest program, który mogę wewnętrznie zmodyfikować, aby zmierzyć wykorzystanie pamięci szczytowej.Pomiar pamięci szczytowej długotrwałego procesu w Linuksie

Naprawdę nie chcę szczegółowych pomiarów, ani nie chcę, żeby zbytnio spowolniły mój program ... więc valgrind lub cokolwiek cięższego nie jest tym, czego szukam ... I podobnie jak inne posty wcześniej [Peak memory usage of a linux/unix process, czas -v nie zgłasza pamięci dla mojej maszyny ...

Mogę po prostu uruchomić top lub ps i wyodrębnić ciągi pamięci za mój identyfikator procesu za pomocą prostego skryptu. Jednak mój proces trwa około 20-30 minut, więc chcę być w stanie zalogować się i uzyskać max. Mogę tolerować gruboziarniste próbki ... co 1 minuta ... W jaki sposób mam wykonać ten prosty skrypt pM-miar w zsh? 2. zabić, gdy zakończy się proces w ramach testu?

+0

http://www.serverfault.com? –

Odpowiedz

2

Właściwie, co powiedziałem wcześniej:

""”

spróbować

/usr/bin/time -v yourcommand 

które powinny pomóc, jeśli używasz tylko. "Czas", bash będzie wykonywał wbudowanej (że nie ma "-v")

""”

nie działa (0) powraca.

zrobiłem poniższy skrypt (który nazwałem smaps):

#!/usr/bin/perl 
use 5.010; 
use strict; 
use warnings; 
my $max = 0; 
while(open my $f, '<', "/proc/$ARGV[0]/smaps") { 
    local $/; $_ = <$f>; 
    $max = $1 if /Rss:\s*(\d+)/ and $1 > $max; 
    open my $g, '>', '/tmp/max'; 
    say $g $max 
} 

I wtedy nazywamy go (na przykład, obserwować zużycie pamięci qgit za):

bash -c './smaps $$ & exec qgit' 

apostrofów więc "córka" interpretuje $$ (będzie to ten sam PID qgit po exec). to odpowiedź, testowałem :-D

HTH

+1

Wyjście w 2 kawałkach ... nadal nie przydatny :( \t czas użytkownika (w sekundach): 16,50 \t Czas systemowy (sekundy): 0,47 \t procent CPU to zadanie otrzymała: 100% \t Upływający (zegar ścienny) czas (h: mm: ss lub m: ss): 0:16.96 \t Przeciętne wspólne rozmiar tekstu (KB): 0 – badkya

+1

Średnie niedzieloną rozmiar danych (kilobajtów): 0 \t Średnia wielkość stosu (KB): 0 \t Średni całkowity rozmiar (KB): 0 \t Maksymalny rozmiar zestaw rezydenta (kbytes) 0 \t Średnia zestaw zamieszkania wielkość (KB) 0 \t major (wymagające I/o) błędy strony: 0 \t Minor (odzyskiwania ramkę) strona wady: przełączniki 255315 \t dobrowolne kontekstu: 1211 \t Przymusowe kontekst przełączniki: 1232 \t S Punkty WAP: 0 \t wejścia systemu plików: 0 \t wyjść systemu plików: 68472 \t wiadomości Socket wysłania: otrzymał 0 wiadomości \t Socket: 0 \t rozmiar strony (bajtów): 4096 – badkya

+1

pamięci pola użytkowania nie zmieniają się, nawet jeśli uruchom go na dłużej ... – badkya

6

Wystarczy użyć górnej -n, aby powtórzyć określoną liczbę razy, i -d aby opóźnić aktualizację. Ponadto można złapać tylko wyjście istotnych dla procesu przez grepping jego PID, jak:

top -n 30 -d 60 | grep <process-id> 

Czytaj górną stronę podręcznika, aby uzyskać więcej informacji

man top 

Oczywiście, można również pobrać kolumnę potrzebujesz, używając awk.

1

/proc/pid/smaps, podobnie jak/proc/pid/maps, zapewnia jedynie informacje o odwzorowaniach pamięci wirtualnej, a nie o rzeczywistym wykorzystaniu pamięci fizycznej. top i ps dają RSS, który (w zależności od tego, co chcesz wiedzieć) może nie być dobrym wskaźnikiem użycia pamięci.

Jedną z dobrych rzeczy, jeśli używasz jądra systemu Linux później niż 2.6.28.7, jest użycie funkcji Pagemap. Omówiono to i źródło niektórych narzędzi pod adresem www.eqware.net/Articles/CapturingProcessMemoryUsageUnderLinux.

Narzędzie do zbierania stron służy do przechwytywania wykorzystania pamięci WSZYSTKICH procesów, więc prawdopodobnie nakłada większe obciążenie procesora, niż chcesz. Powinieneś jednak łatwo go modyfikować, aby przechwytywał dane tylko dla określonego identyfikatora procesu. To zmniejszyłoby narzut na tyle, aby można było go łatwo uruchomić co kilka sekund. Nie próbowałem go, ale myślę, że narzędzie do analizy strony powinno działać bez zmian.

EQvan

2

Valgrind z massif nie powinno być zbyt ciężki, ale, polecam korzystania/proc. Możesz łatwo napisać własny skrypt monitora. Oto moja, dla Twojej wygody:

#!/bin/bash 

ppid=$$ 
maxmem=0 

[email protected] & 
pid=`pgrep -P ${ppid} -n -f $1` # $! may work here but not later 
while [[ ${pid} -ne "" ]]; do 
    #mem=`ps v | grep "^[ ]*${pid}" | awk '{print $8}'` 
     #the previous does not work with MPI 
     mem=`cat /proc/${pid}/status | grep VmRSS | awk '{print $2}'` 
    if [[ ${mem} -gt ${maxmem} ]]; then 
     maxmem=${mem} 
    fi 
    sleep 1 
    savedpid=${pid} 
    pid=`pgrep -P ${ppid} -n -f $1` 
done 
wait ${savedpid} # don't wait, job is finished 
exitstatus=$? # catch the exit status of wait, the same of [email protected] 
echo -e "Memory usage for [email protected] is: ${maxmem} KB. Exit status: ${exitstatus}\n" 
1

Zależy to od rodzaju pamięci, którą chcesz monitorować.

Monitorowanie następującego M.a.p.d przez posortowanie liczby wszystkich procesów (nie wszystkich wątków) pozwoli ci monitorować pamięć fizyczną malloc, z której korzysta każdy proces.

Możesz napisać program c, który sprawi, że będzie jeszcze szybszy, ale pomyślałem, że awk był minimalnym wyborem do tego celu.

  • Ma anonimowy odwzorowane pamięć
    • .p prywatny
      • .D brudną == malloc/mmapped sterty i stosu przydzielone i napisany pamięć
      • .c czysty == malloc/mmapped sterty i pamięć stosu raz przydzielona, ​​napisana, a następnie zwolniona, ale jeszcze nie odzyskana
    • .s udostępniona
      • .D brudny == powinien istnieć żaden
      • .c czysty == powinien istnieć żaden
  • Mn nazwie odwzorowane pamięć
    • .p prywatny
      • .d dirty == plik mmapped pisemna pamięć prywatna
      • .c czyste == odwzorowywany tekst programu/biblioteki prywatne odwzorowane
    • .s wspólny
      • .D brudny plik == mmapped napisany pamięć dzielona
      • .c == czysty tekst odwzorowany biblioteka dzielonego odwzorowane

wolałbym aby uzyskać numery w następujący sposób, aby uzyskać liczb rzeczywistych w najmniejszym obciążeniu.
Musisz je podsumować, aby podzielić, co ps pokazuje jako RSS i uzyskać dokładniejsze liczby, aby nie mylić.

MAPD:

awk '/^[0-9a-f]/{if ($6=="") {anon=1}else{anon=0}} /Private_Dirty/{if(anon) {asum+=$2}else{nasum+=$2}} END{printf "sum=%d\n",asum}' /proc/<pid>/smaps 

MAPC:

awk '/^[0-9a-f]/{if ($6=="") {anon=1}else{anon=0}} /Private_Clean/{if(anon) {asum+=$2}else{nasum+=$2}} END{printf "sum=%d\n",asum}' /proc/<pid>/smaps 

Mnpd: ... i tak dalej

1

Dokładne dane pamięci mogą być podane przez interfejs jądra pagemap - wykorzystywana w libpagemap biblioteki https://fedorahosted.org/libpagemap/. Biblioteka zapewnia również funkcje użytkownika przestrzeni roboczej, dzięki czemu można natychmiast uruchomić pamięć monitora.

1

Lepszą alternatywą dla mierzenia zużycia szczyt/wysokiej wody pamięci RSS jest narzędziem dostępnym cgmemtime tutaj:

https://github.com/gsauthof/cgmemtime

To tak łatwy w użyciu jak /usr/bin/czas i bez spowolnienia od Masyw Valgrinda. Poza tym jest oparty na funkcji jądra o nazwie cgroups, więc jest jeszcze bardziej dokładny niż inne metody odpytywania.

Powiązane problemy