Jak rejestrujesz ilość pamięci używanej przez aplikację w systemie OS X

0

Jestem na komputerze Mac Mini z systemem OS X 10.8.2. Jestem twórcą aplikacji, ale w tym przypadku buduję aplikację w C ++, więc nie mogę używać Xcode do tego pytania. Chciałbym śledzić, ile pamięci używa moja aplikacja, ale nie chcę jej ręcznie zapisywać. Jak mam to zrobic.

WIĘCEJ INFORMACJI: Chcę nagrywać przez cały dzień. Aplikacja będzie działać przez cały dzień, aby móc porównywać szczyty pamięci. Nie jestem przeciwny aplikacjom innych firm, o ile są one niezawodne. Dzięki.

Josiah
źródło
Naprawdę nie programistą, ale Valgrind może?
slhck
Możesz użyć aplikacji Instruments, dołączając do dowolnego procesu bez uruchamiania samego Xcode.
Ken
Widziałem to. Nie widziałem jednak możliwości „cofnięcia się w czasie” i oglądania pamięci przez cały dzień. Jeśli możesz wyjaśnić, jak go używać / przeczytaj. Tak będzie dobrze.
Josiah

Odpowiedzi:

3

Powinieneś być w stanie to zrobić za pomocą standardu ps dowództwo. Z man ps:

%mem        %MEM      ratio of the process's resident set size  to the physical
                      memory on the machine, expressed as a percentage.  

rss         RSS       resident set size, the non-swapped physical memory that 
                      a task has used (inkiloBytes). 

vsz         VSZ       virtual memory size of the process in KiB (1024byte units).
                      Device mappings are currently excluded; this is subject
                      to change. 

Jedyne inne szczegóły, których potrzebujesz to PID procesu. Jeśli więc Twoja aplikacja nazywa się myApp, możesz uzyskać PID w następujący sposób:

ps x | grep myApp

Który drukuje taką listę:

15909 pts/3    S      0:37 myApp
22583 pts/6    S+     0:00 grep --color myApp

Pierwsza kolumna to identyfikator procesu (PID). Teraz, jeśli chcesz to zautomatyzować, musisz pominąć linię zawierającą polecenie grep i zapisać wynik w zmiennej BASH:

pid=$(ps x | grep myApp | grep -v grep | awk '{print $1}')

The awk część powoduje, że polecenie drukuje tylko pierwsze pole, PID.


Możesz to wszystko połączyć w jedną linijkę, która co minutę zaoszczędzi pamięć twojej aplikacji w pliku o nazwie memlog.txt:

while sleep 60; do \
    pid=$(ps x | grep myApp | grep -v grep | awk '{print $1}') && \
    ps xo pid,rss,vsz,%mem | grep "$pid" >> memlog.txt ; \
done 
  • while sleep 60 powoduje, że bash działa w nieskończonej pętli, czekając na 60 sekund między pętlami
  • sleep 60 każe mu czekać 60 sekund. Zmień tę wartość, jeśli chcesz ją częściej aktualizować.

Wynikowym wynikiem jest plik ( memlog.txt ) z 4 kolumnami: PID twojej aplikacji, rozmiar zestawu rezydentnego, rozmiar pamięci wirtualnej i procent pamięci. Na przykład:

4166 25240 633028  0.3
4166 25240 633028  0.3
4166 25240 633028  0.3

Można to łatwo rozszerzyć o użycie procesora i czas dla każdego pomiaru. Na przykład, aby uwzględnić czas:

while sleep 60; do \
    date=$(date +%D" "%H:%M:%S);
    echo -n "$date : " >> memlog.txt;
    pid=$(ps x | grep myApp | grep -v grep | awk '{print $1}') && \
    ps xo pid,rss,vsz,%mem | grep "$pid" >> memlog.txt; \
done 
terdon
źródło
W pierwszym wierszu pojawia się błąd. Nie sądzę, gdy (1); zrobić poprawnie. Popraw to. Ponadto, jeśli to działa, wolałbym coś bardziej wizualnego. Nie wydaje się, żeby to było trudne.
Josiah
Naprawdę chciałbym coś takiego jak Instruments.app, a może to dokładnie to narzędzie. Jednak nawet jeśli rejestruje pamięć, nie wydaje się, aby śledził pamięć konkretnej aplikacji.
Josiah
@AceLegend, the ` jest po prostu powiedzieć BASH, że polecenie jest kontynuowane w następnej linii, używane tutaj dla ułatwienia czytania. Powinno zadziałać, jeśli skopiujesz wklej bezpośrednio, to nie będzie kopiowane ręcznie. Cała rzecz w jednej linii jest while(1); do date=$(date +%D" "%H:%M:%S); echo -n "$date : " >> memlog.txt; pid=$(ps x | grep myApp | grep -v grep | gawk '{print $1}') && ps xo pid,rss,vsz,%mem | grep "$pid" >> memlog.txt; sleep 60 ; done. Jeśli chodzi o wizualne, wziąłbym wartości i wykreślił je.
terdon
Rozumiem, ale nadal nie działa. Stworzyłem plik z linią #! / Bin / bash pominięty wiersz, a następnie: while(1); do date=$(date +%D" "%H:%M:%S); echo -n "$date : " >> memlog.txt; pid=$(ps x | grep Nightly | grep -v grep | gawk '{print $1}') && ps xo pid,rss,vsz,%mem | grep "$pid" >> memlog.txt; sleep 60 ; done
Josiah
Następnie zapisałem go jako memTesting.sh i użyłem sudo chmod +x aby uczynić go wykonywalnym. Następnie ./memTesting.sh. Nadal generuje błąd informujący, że używa nieznanego polecenia.
Josiah