Jak zdiagnozować balonowe jądro OS X i użycie pamięci przewodowej?

18

Mam bardzo dziwny problem, z którym trudno mi zdiagnozować podstawową przyczynę.

Mam komputer Mac Pro (2008, 8-rdzeniowy 2.8 GHz, 8800GT) z 14 GB pamięci RAM (ostatnio zaktualizowany z powodu tego problemu!).

Po uruchomieniu systemu i zalogowaniu się, vm_stat / top / Activity Monitor pokaże, że zadanie jądra ma przydzielone około 150 MB, a maszyna ma przydzielone około 800 MB pamięci przewodowej.

Nawet początkowo 800 MB wydaje się okropnie dużo pamięci przewodowej do przydzielenia bez uruchomionych aplikacji - ale jest coraz gorzej. (Uwaga: Przewodowa jest zablokowana, pamięć niewymienna )

Po bardzo krótkim czasie, czasami uruchamianym przez coś tak prostego, jak uruchomienie terminalu, kernel_task przeskoczy do 8-900 MB rzeczywistej pamięci (RSIZE), a pamięć przewodowa przyspieszy do 1,6 GB (co oznacza, że ​​wszystkie dodatkowe żądania pamięci dotyczą przewodowa pamięć RAM w jądrze).

Jeśli porzucę wszystko (IE: brak uruchomionych aplikacji, zablokowanie monitora aktywności lub terminala, aby wyświetlić górę), nie będzie znaczącego zmniejszenia ani kernel_task RSIZE, ani użycia pamięci przewodowej. Postępowanie w drugą stronę i ładowanie systemu zadaniami pokazuje również, że pamięć przewodowa nie ulega zmniejszeniu - i, co ważne, nie jest zmniejszana zamiast intensywnej wymiany.

Jeśli się wyloguję i zaloguję ponownie, to trochę się zmniejszy (450 MB kernel_task, 1,28 GB Przewodowy), ale nie wróci do początku.

Nie używam żadnych zwariowanych kextów - a ponadto kextstat nie pokazuje tam żadnych dużych alokacji pamięci; największy to com.apple.nvidia.nv50hal przy około 4 MB pamięci.

Maszyna wydaje się bardziej powolna, gdy tak się dzieje - co nie jest zaskakujące, ponieważ tak ogromna ilość pamięci RAM została oznaczona jako niepartowalna.

Mam więc kilka pytań:

1) Czy istnieje dobry sposób na zdiagnozowanie, co przypisało całą tę pamięć przewodową? Często jest ponad 2 razy większy niż rozmiar jądra, bez uruchamiania żadnych aplikacji. Rzeczywista suma pamięci wydaje się nie sumować - wygląda na to, że istnieje mnóstwo pamięci RAM, która nie jest nigdzie rozliczana.

2) Co się dzieje, że jądro nagle potrzebuje 6 razy więcej pamięci?

kenorb
źródło
1
Prawdopodobnie związane z tym code.google.com/p/chromium/issues/detail?id=345664
jackkav

Odpowiedzi:

5

Aby dowiedzieć się, dlaczego jądro zużywa więcej pamięci niż zwykle, możesz użyć różnych narzędzi.

  1. Uruchom Monitor aktywności, aby sprawdzić, które procesy wykorzystują najwięcej pamięci, więc jest to albo kernel_taskżadne inne zadanie wykorzystujące więcej pamięci niż zwykle (następnie rozważ zabicie).
  2. Uruchom w Terminalu, vm_stat 1aby zobaczyć statystyki pamięci w czasie rzeczywistym i czy twoja pamięć naprawdę zwiększa się co sekundę.
  3. Uruchom fs_usage(jako root) narzędzie do monitorowania wywołań systemowych i błędów stron w czasie rzeczywistym.
  4. Aby sprawdzić sumę nieprzyzwoitych / anonimowych przydziałów wielu procesów uruchomionych w Terminalu:

    sudo footprint -all -categories -swapped -collapseSharing
    

    Gromadzi informacje o pamięci, takie jak ilość zamienionych pamięci (na pamięć użytkownika lub jądra).

  5. Co więcej, jeśli uważasz, że jądro zajmuje najwięcej pamięci, wypróbuj zprintnarzędzie:

    sudo zprint -t -s | head -n20
    

    Wyświetli informacje o strefach jądra

Jeśli chcesz wymusić wyczyszczenie pamięci podręcznej dysku (aby zwolnić trochę pamięci), możesz spróbować:

sync && sudo purge

Zobacz także: Jak sprawdzić użycie pamięci zadań wysokiego jądra? w AD SE

kenorb
źródło
3

Rozszerzenia jądra są tylko jednym z wielu fragmentów kodu, które mogą być wykonywane przez system operacyjny bez Twojej wiedzy. Mam małe narzędzie oparte na języku Python o nazwie Consultant's Canary, które pomoże ci znaleźć kilka z nich:

Jeśli nie pojawi się żaden potencjalny winowajca, powiedziałbym, że bootuje się z czystej instalacji i sprawdzam, czy możesz odtworzyć tam problem.

Hasaan Chop
źródło