Urządzenia uruchamiane w Androidzie 12 i nowszych korzystają z funkcji mm_events
, która obejmuje zestaw statystyk związanych z pamięcią i jest okresowo rejestrowany, gdy system odczuwa presję pamięci. mm_events
jest zintegrowany z mechanizmami perfetto
, a ponieważ jest uruchamiany tylko wtedy, gdy wykryto presję pamięci, jego wpływ na wydajność jest minimalny. Zbieranie statystyk rozpoczyna się, gdy zostaną uruchomione mechanizmy kswapd
, direct reclaim,
lub compaction
jądra. Zbieranie trwa przez określony okres, aby móc rejestrować statystyki w regularnych odstępach czasu.
Zamiast jednorazowego zrzutu stanu pamięci systemu po przesłaniu zgłoszenia błędu mm_events
wyświetla krótkie dane historyczne dotyczące statystyk pamięci w okresach obciążenia pamięci. Zbierane statystyki są wymienione w poniższych tabelach.
Pola vmstat
nr_free_pages | nr_slab_reclaimable |
nr_slab_unreclaimable | nr_active_file |
nr_inactive_file | nr_active_anon |
nr_inactive_anon | workingset_refault |
workingset_activate | nr_file_pages |
pgpgin | pgpgout |
pswpin | pswpout |
pgsteal_kswapd_dma | pgsteal_kswapd_normal |
pgsteal_kswapd_movable | pgsteal_direct_dma |
pgsteal_direct_normal | pgsteal_direct_movable |
pgscan_kswapd_dma | pgscan_kswapd_normal |
pgscan_kswapd_movable | pgscan_direct_dma |
pgscan_direct_normal | pgscan_direct_movable |
compact_migrate_scanned | compact_free_scanned |
Zdarzenia związane z wyszukiwaniem w sieci
vmscan/mm_vmscan_kswapd_wake | vmscan/mm_vmscan_kswapd_sleep |
vmscan/mm_vmscan_direct_reclaim_begin | vmscan/mm_vmscan_direct_reclaim_end |
compaction/mm_compaction_begin | compaction/mm_compaction_end |
Analizowanie danych mm_events
Jeśli mm_events
jest włączona, raporty o błędach dotyczące zdarzeń zarejestrowanych wkrótce po tym, jak urządzenie zaczęło odczuwać wysokie obciążenie pamięci, zawierają historyczne statystyki mm_events
w postaci skompresowanego raportu w folderze FS/data/misc/perfetto-traces/bugreport/systrace.pftrace.
.
Zarówno dane vmstat
, jak i zdarzenia ftrace
można wyświetlać do analizy za pomocą interfejsu Perfectto.
dane vmstat
Prześlij plik systrace.pftrace
do interfejsu Perfecto, aby wyświetlić dane vmstat
na osi czasu, jak pokazano na rysunku 1.
Rysunek 1. Oś czasu z danymi graficznymi z vmstat.
zdarzenia ftrace.
Przechwycone ftrace
mm_events
nie są wyświetlane graficznie na osi czasu. Aby je wyświetlić, kliknij kartę Zapytanie SQL, która znajduje się w miejscu pokazanym na rysunku 2.
Rysunek 2. Aby uzyskać dostęp, kliknij Zapytanie (SQL).
Włącz mm_events
Aby włączyć mm_events, ustaw parametr sysprop persist.mm_events.enabled=true
dostawcy init.rc
.
Aby ograniczyć wykorzystanie pamięci i procesora przez mm_events, zastosowaliśmy te rozwiązania:
- Instancja
mm-events ftrace
używa bufora 4 KB na procesor. - Wyzwalacz
kmem_activity
jest ograniczony do jednej akcji na minutę. - W danym momencie może być aktywna tylko 1 sesja
mm-events
.
Dostosowywanie
mm_events
używa pliku konfiguracji perfetto
, aby określić, jakie statystyki mają być rejestrowane podczas sesji śledzenia.
W sekcji /vendor/etc/mm_events.cfg
możesz podać niestandardową konfigurację śledzenia w Perfetto.
Opis dostępnych pól konfiguracji śladu znajdziesz w dokumentacji Perfectto.
Przykładową konfigurację śledzenia znajdziesz w tym mm_events.cfg
przykładzie.
W tym fragmencie kodu widać ważne pola, które należy uwzględnić w konfiguracji śledzenia, aby zapewnić jej wywołanie w przypadku naciśnięcia przycisku pamięci:
# Ensures only 1 tracing session with this key can be active
unique_session_name: "perfetto_mm_events_session"
# If a trace with bugreport_score > 0 is running,
# the captured data is made available in the zipped bugreport
# at FS/data/misc/perfetto-traces/bugreport/systrace.pftrace
bugreport_score: 100
trigger_config {
trigger_mode: START_TRACING
trigger_timeout_ms: 3600000 # 1 hour
triggers {
# kmem_activity trigger gets activated when memory pressure
# is detected
name: "kmem_activity"
stop_delay_ms: 360000 # 6 mins
}
}
W tej konfiguracji mm_events
inicjuje zdarzenie kmem_activity
w Perfetto, a sesja śledzenia Perfeto zaczyna rejestrować zdarzenia pamięci vm_stats
i ftrace
do końca skonfigurowanego okresu stop_delay_ms
, który wynosi 36 tys. ms (6 minut).
Czas oczekiwania na uruchomienie jest ustawiony na dużą wartość (w tym przypadku 1 godzinę), a mm_events config
jest okresowo ponownie uruchamiany, aby zapewnić, że mm_events
jest zawsze włączona. W efekcie generowany jest raport o błędach zawierający dane takie jak na rys. 1 i rys. 2.