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.


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 

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