Urządzenia uruchamiane w Androidzie 12 i nowszych korzystają z funkcji mm_events
, czyli zbioru statystyk związanych z pamięcią, które są okresowo rejestrowane, gdy system odczuwa presję pamięci. mm_events
jest zintegrowany z mechanizmami śledzenia perfetto
i jest uruchamiany tylko wtedy, gdy wykryto presję pamięci, więc 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 wyświetlać jednorazowy zrzut stanu pamięci systemowej podczas wysyłania raportu o błędzie, mm_events
wyświetla krótki widok danych historycznych dotyczących pamięci w okresach dużego 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 logu czasu związane z mm
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 |
Analizuj dane 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 Perfecto.
dane vmstat
Prześlij plik systrace.pftrace
do interfejsu Perfecta, aby wyświetlić dane vmstat
na osi czasu, jak pokazano na rysunku 1.
Rysunek 1. Osi czasu z danymi graficznymi 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
ma ograniczenie częstotliwości do 1 raza na minutę. - W danym momencie aktywna może być tylko 1 sesja śledzenia
mm-events
.
Dostosowywanie
mm_events
używa pliku konfiguracji perfetto
, aby określić, które 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 śledzenia znajdziesz w dokumentacji Perfetto.
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 nacisku 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 perfetto 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 aktywatora jest ustawiony na dużą wartość (w tym przypadku jest to 1 godzina), a funkcja mm_events config
jest okresowo ponownie włączana, aby zasada mm_events
była zawsze włączona. W efekcie generowany jest raport o błędzie, który zawiera dane takie jak te widoczne na rys. 1 i rys. 2.