Ile wymiany używa dana aplikacja Mac?

15

Czy jest jakiś sposób na stwierdzenie, czy konkretna aplikacja działająca w systemie Mac OSX (10.2+) zamieniła część pamięci (np. Na jeden z /private/var/vm/swapfile*plików)? I jak dużo?

Nagroda (150 rps)

Proste pytanie. Pierwsza poprawna odpowiedź zostanie zaakceptowana, jeśli zobaczę ją po upływie mniej niż 2 dni od wygaśnięcia okresu nagrody. Jeśli nadal go nie mam, przyznam go każdemu, kto opowie mi najciekawszy nowy fakt. A jeśli nie nauczyłem się ani jednej rzeczy z żadnej z odpowiedzi, przyznam nagrodę każdemu, kto pisze najładniej.

Charles Stewart
źródło
To takie złe pytanie. Liczba, której szukasz, zmieni się, ponieważ próbujesz ją zmierzyć (pomyśl o zasadzie nieoznaczoności Heisenberga). Ponadto zmieniłby się cały czas w zależności od innych aplikacji i ich wymagań dotyczących pamięci, wzorców io i priorytetu procesu. Jeśli znajdziesz numer, nic ci to nie da, chyba że edytujesz kod systemu operacyjnego, ponieważ niewiele możesz zrobić z punktu widzenia aplikacji, aby go zmienić.
gavaletz
3
@gavaletz: Zejść dziś rano z niewłaściwej strony łóżka? Chcę tego rodzaju profilowania wymiany, które Linux umożliwia za pomocą / proc / $ pid / smaps. Zwykle potrafię rozpoznać nagłe gwałtowne zmiany aktywności za pomocą uszu, więc nie przeszkadza mi zasada nieoznaczoności gavaletza.
Charles Stewart,

Odpowiedzi:

13

Dużo googlowałem ;-) Jak rozumiem, pamięć wirtualna danego procesu jest podzielona na strony obsługiwane przez system operacyjny i prezentowane aplikacji tak, jakby była pamięcią RAM.

W OS X opartym na jądrze Macha jest to obsługiwane przez demona o nazwie dynamic_pager. Ten proces generuje pliki wymienne, /private/var/vmjak wspomniałeś. Te pliki wymiany nie są generowane dla poszczególnych aplikacji, ale na podstawie „potrzebnej pamięci”. Pliki wymiany są dzielone na strony o długości 4096 bajtów, a następnie strony są przydzielane do procesów, które (są uważane przez system operacyjny za) potrzebują pamięci wirtualnej. Dlatego nie można skojarzyć pliku wymiany z daną aplikacją, ale można zobaczyć, ile stron używa dany proces.

Możesz spróbować użyć polecenia vm_statw Termial. To daje ci statystyki użycia VM (zwróć uwagę, że „rozmiar strony” razy liczba aktywnych stron jest równa rozmiarowi twoich plików wymiany). To wyjaśnia również, dlaczego możesz mieć wiele procesów przy użyciu maszyny wirtualnej, ale tylko kilka plików wymiany.

Inne zabawne polecenia to vmmap [process id]i pagestuff.

trolle3000
źródło
Nawiasem mówiąc, sprawdź developer.apple.com/mac/library/documentation/Darwin/Conceptual/…, jeśli chcesz dowiedzieć się więcej.
trolle3000
To wygląda obiecująco. Wydaje się, że stanowi to jednoznaczną odpowiedź na pierwszą część pytania i sugeruje konkretną odpowiedź na drugą część. Muszę kopać dalej ...
Charles Stewart
Nie jest vmmap [pid]lub vmmap -pages [pid]odpowiedź na drugą część pytania?
trolle3000,
vmmap $ pid podaje jednoznaczne informacje o tym, co klasyfikuje jako regiony do zapisu. Nie rozróżnia przydzielonej (tj. Wymiennej) i zamienionej pamięci dla regionów tylko do odczytu, ale być może rozróżnienie nie jest tak ważne. Prawdopodobnie jutro przyjmuję tę odpowiedź.
Charles Stewart,
5

vmmap PIDPolecenie powinno dać wam kilka pomocnych statystyk w liczbach o danym procesie.

ayaz
źródło
działa nawet vmmap [AppName]
Studer
4

W oparciu o zamieszczone tutaj pomysły stworzyłem ten mały wiersz kodu:

sudo vmmap notifyd | grep -A3 'Summary'

który wyświetla sekcję Podsumowanie (3 linie) wyjścia vmmap. Użyłem notifydtego przykładu, ale możesz go zastąpić dowolnym znanym PID.

Ta linia spróbuje wyświetlić wszystkie linie Podsumowania wszystkich uruchomionych procesów. Oczywiście niektóre zawiodą, ponieważ ich identyfikator procesu już zniknął (proces zakończony), ale ogólnie uważam, że jest to świetny sposób na przewijanie listy informacji o pamięci i wykrycie głównego zamieniacza.

ps -o pid= -xa | awk '{print $1}' | xargs -n 1 sudo vmmap | grep -A3 'Summary'

Edytowano: Pewien anonimowy użytkownik widział, że ten ostatni wiersz poleceń wymaga ulepszenia, ponieważ oczywiście oryginalny wariant już nie działał. Dziękuję bardzo, kimkolwiek jesteś i przykro mi, że Twoja edycja została odrzucona. (Pierwsze polecenie poprzednio brzmiało „ps xa” i powodowało niepowodzenie vmmap z powodu rzucenia na niego nagłówka ps)

Dalsza poprawa: jeśli chcesz od razu poznać nazwę programu, skorzystaj z tej małej zmiany

ps -o pid= -xa | awk '{print $1}' | xargs -n 1 sudo vmmap | egrep 'swapped_out|Path'

Mała poprawka na drugim końcu tego polecenia umożliwia filtrowanie pod kątem niektórych nazw programów lub komponentów ścieżki wiersza poleceń. Tutaj przyglądamy się tylko wszystkim procesom z „Library / PrivateFrameworks”.

ps -o pid,command= -xa | grep 'Library/PrivateFrameworks' | awk '{print $1}' | xargs -n 1 sudo vmmap |
Andreas
źródło
Dostaję wiele błędów, które mówią, że vmmap nie może zostać uruchomiony jako proces 32, ale zatrzymuje xargs. Aby uzyskać kontynuowanie kart, zrobiłem to ps -o pid= -xa | awk '{print $1}' | xargs -n 1 -I{} bash -c ‘sudo vmmap {} || true’ | egrep 'swapped_out|^Path:|^Process:'. Nadal nie zatrzymuje się na ctrl + c, ale także nie zatrzymuje się na błędach vmmap.
ShadSterling
0

Otwórz Monitor aktywności w folderze / Aplikacje / Narzędzia, a kolumna Pamięć wirtualna to powie. Możesz kliknąć nagłówek Pamięć wirtualna, aby posortować według większości lub najmniej wykorzystania przez aplikację. Pamiętaj również, aby zmienić Moje procesy na Wszystkie procesy i pamiętaj, że jedna aplikacja może mieć wiele procesów. Na przykład aplikacja Little Snitch innej firmy składa się z „Little Snitch Network Monitor” i „Little Snitch UIAgent”.

ridogi
źródło
4
To jest źle. Kolumna nubmer w pamięci wirtualnej jest sumą pamięci aktualnie znajdującej się w pamięci RAM i na plikach wymiany, mmaped i nie wiem co jeszcze.
Tadeusz A. Kadłubowski
Jesteś pewny? Apple nie wspomina o tym support.apple.com/kb/TA20517
ridogi
1
Numer maszyny wirtualnej mierzy przydzieloną, ale jeszcze niewykorzystaną kwotę. Pliki wymiany będą miały faktycznie używane.
Chealion
@Chealion: jak zdefiniować pamięć, która jest przydzielona, ​​ale nie jest faktycznie używana?
Tadeusz A. Kadłubowski,
@tkadlubo: W tym przypadku uważam, że jest to tylko rozbieżność między podanym rozmiarem maszyny wirtualnej dostępnym dla procesu a rzeczywistymi stronami, stronicowanymi na dysk. Nie jestem pewien, jak to zdefiniować, zauważając, że numer maszyny Wirtualnej i pliki wymiany na dysku są różne.
Chealion
0

Jak powiedział ridogi, otwórz Monitor aktywności. Przejdź do procesu, który chcesz sprawdzić, i kliknij ... Sprawdź! Następnie kliknij pamięć; powie ci ile wymiany używa dany proces.

Baw się dobrze!

trolle3000
źródło
3
Strona inspekcji informuje mnie o wielu ciekawych rzeczach, które są pozytywnie skorelowane z odpowiedzią na pytanie, takich jak #pagefaults, #pageins i lista plików mapowanych mapami, ale nigdzie nie ma rzeczywistej odpowiedzi na pytanie, które szukam.
Charles Stewart