2009-05-13 15 views
6

Chciałbym śledzić, ile pamięci różne programy dotykają w określonych stanach. Na przykład powiedzmy, że mam program graficzny. Może zużywać znacznie mniej pamięci, gdy jest zminimalizowany, ponieważ nie będzie przerysowywać okna, które wymaga odczytywania obrazów i czcionek oraz wykonywania wielu funkcji bibliotecznych. Obiekty te są nadal dostępne w pamięci, ale w rzeczywistości nie są używane.Śledzenie aktywnie używanej pamięci w programach linuksowych

Narzędzia takie jak top mają ograniczoną użyteczność, ponieważ po prostu mówią, ile pamięci jest mapowane na przestrzeń adresową programu i jaka jest jej część w fizycznej pamięci RAM. Podobnie, wykrywacze nieszczelności powiedzą tylko, kiedy pamięć jest niedostępna, a nie, jeśli po prostu nie jest używana.

Czy istnieje narzędzie, które pozwala w ten sposób śledzić aktywnie/nieużywaną pamięć? Jeśli to możliwe, chciałbym śledzić użycie nie tylko na stercie, ale również w pamięci przechowującej kod programu/biblioteki.


EDIT: chciałbym wyjaśnić: Chcę wiedzieć znacznie więcej pamięci program faktycznie czyta, pisze, lub wykonuje w pewnym momencie, to znaczy, po osiągnięciu pewnego stanu. Podczas gdy liczba stron w przestrzeni adresowej i liczba stron rezydentnych są ważnymi pomiarami, nie jest to tym, czego szukam.

mam realizuje trzy podejścia teraz:

  1. pisałem bibliotekę że czyści bity ochrony wszystkich obszarów pamięci (oprócz stosu i własnym kodem) z pliku/proc/self/mapy używając `mprotect`. Posiada mechanizm segfault, który przywraca bity ochrony i zwiększa licznik. Załaduję go za pomocą `LD_PRELOAD`, i zaczyna śledzić dostęp do pamięci po otrzymaniu sygnału. Doprowadziło to do pewnych prawdziwych błędów z pozornie fałszywymi adresami (nie są one przechowywane w żadnych rejestrach lub pobliskiej pamięci w momencie wystąpienia błędu).
  2. Napisałem program `purge`, który przydziela i czyta z pamięci używając` mmap` dopóki `mmap` nie zwróci błędu. Miejmy nadzieję, że wymusi wszystkie strony z procesu docelowego, który jest zawieszony, podczas gdy `purge` jest uruchomiony. Następnie liczę liczbę stron, gdy proces docelowy zostanie wznowiony, używając `pidstat`. To wydaje się działać, ale jest to bardzo tępy instrument. Nie podaje żadnych informacji o stronach, które zostały dotknięte.
  3. Powiedziano mi, że valgrind umożliwia pisanie wtyczek, które powodują wykonanie określonych akcji w określonych zdarzeniach, np. Dostęp do pamięci. To wygląda obiecująco.
+0

duplikat: http://stackoverflow.com/questions/131303/linux-how-to-measure-actual -memory-usage-of-an-application-or-process – lothar

Odpowiedz

2

Cachegrind narzędzia valgrind wykonuje dobrą robotę śledzenia użycia pamięci.

Istnieje również kilka narzędzi, które wyświetlają graficznie dane wyjściowe z cachegrind .

Edytuj, aby odpowiedzieć na zaktualizowane informacje:
Przed pojawieniem się valgrind użyłem projektu o nazwie mpatrol.
Używa funkcji mprotect(), aby strony były tylko do odczytu i śledzi dostęp do stron
. Umożliwia także określenie czasu rozpoczęcia i zakończenia raportowania, np. Po n malloc, między innymi specyfikacjach.

Może to zrobić wiele lub wszystkie funkcje, których szukasz.

Jedno zastrzeżenie, to jest dużo wolniejsza niż valgrind.

Powiązane problemy