Urządzenia uruchamiane z systemem Android 12 i nowszym korzystają z mm_events
– zestawu statystyk związanych z pamięcią, które są okresowo przechwytywane, gdy w systemie występuje obciążenie pamięci. mm_events
jest zintegrowane z mechanizmami śledzenia perfetto
, a ponieważ jest aktywowane tylko w przypadku wykrycia zużycia pamięci, dodatkowe obciążenie wydajności jest minimalne. Zbieranie statystyk rozpoczyna się w momencie aktywacji mechanizmów kswapd
, direct reclaim,
lub compaction
jądra i pozostaje aktywne przez konfigurowalny okres czasu, aby przechwytywać statystyki w regularnych odstępach czasu.
Zamiast zapewniać jednorazową migawkę stanu pamięci systemowej po złożeniu raportu o błędzie, mm_events
pokazuje krótki historyczny przegląd statystyk pamięci w okresach dużego zużycia pamięci. Przechwycone statystyki przedstawiono 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 śladowe 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ń, które zostaną przechwycone wkrótce po tym, jak urządzenie zacznie doświadczać dużego obciążenia pamięci, zawierają historyczne statystyki mm_events
w formie spakowanego raportu w FS/data/misc/perfetto-traces/bugreport/systrace.pftrace.
Zarówno dane vmstat
, jak i zdarzenia ftrace
można przeglądać w celu analizy za pomocą interfejsu użytkownika Perfetto .
dane vmstatu
Prześlij plik systrace.pftrace
do interfejsu użytkownika Perfetto, aby zobaczyć dane vmstat
w formie wykresu na osi czasu, jak pokazano na rysunku 1:
Rysunek 1. Oś czasu danych graficznych vmstat.
zdarzenia ftrace
Przechwycone ftrace
mm_events
nie są wyświetlane graficznie na osi czasu. Aby je wyświetlić, kliknij zakładkę Query SQL , zlokalizowaną tak, jak pokazano na rysunku 2:
Rysunek 2. Kliknij Zapytanie (SQL), aby uzyskać dostęp.
Włącz mm_events
Aby włączyć mm_events, ustaw sysprop persist.mm_events.enabled=true
z init.rc
dostawcy.
Aby zmniejszyć obciążenie pamięci i procesora przez mm_events, zastosowano następujące rozwiązania:
- Instancja
mm-events ftrace
wykorzystuje bufor 4 KB na procesor. - Wyzwalacz
kmem_activity
jest ograniczony do raz na minutę. - W dowolnym momencie może być aktywna tylko sesja śledzenia
mm-events
.
Dostosowywanie
mm_events
używa pliku konfiguracyjnego śledzenia perfetto
, aby określić, które statystyki mają być przechwytywane podczas sesji śledzenia.
Możesz podać niestandardową konfigurację śledzenia Perfetto w /vendor/etc/mm_events.cfg
. Opis dostępnych pól konfiguracji śledzenia można znaleźć w dokumentacji Perfetto . Przykładową konfigurację śledzenia można znaleźć w tym przykładzie pliku mm_events.cfg
.
We fragmencie pokazano ważne pola, które należy uwzględnić w konfiguracji śledzenia, aby mieć pewność, że zostanie ono uruchomione w wyniku wykorzystania 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 wyzwalacz perfetto kmem_activity
, a sesja śledzenia Perfetto rozpoczyna przechwytywanie zdarzeń pamięci vm_stats
i ftrace
aż do końca skonfigurowanego okresu stop_delay_ms
, 36000 ms (6 minut). Limit czasu wyzwalania jest ustawiony na dużą wartość (w tym przypadku 1 godzinę), a mm_events config
jest okresowo ponownie konfigurowana, aby zapewnić, że mm_events
jest zawsze włączone. W rezultacie generowany jest raport o błędzie zawierający dane pokazane na rysunkach 1 i 2 .