Urządzenia uruchamiane w systemie Android 12 lub nowszym wykorzystują mm_events
, zestaw statystyk związanych z pamięcią, które są rejestrowane okresowo, gdy system doświadcza presji pamięci. mm_events
jest zintegrowany z mechanizmami śledzenia perfetto
, a ponieważ jest aktywowany tylko po wykryciu presji pamięci, dodatkowe obciążenie związane z wydajnością jest minimalne. Zbieranie statystyk rozpoczyna się, gdy aktywowane są mechanizmy kswapd
, direct reclaim,
lub compaction
jądra i pozostają aktywne przez konfigurowalny okres czasu , aby zbierać 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 widok statystyk pamięci w okresach obciążenia pamięci. Przechwycone 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 śledzenia 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 |
Analizowanie danych mm_events
Jeśli mm_events
jest włączona, raporty o błędach dla zdarzeń, które zostaną przechwycone wkrótce po tym, jak urządzenie zacznie doświadczać wysokiego obciążenia pamięci, dostarczają historyczne statystyki mm_events
w postaci spakowanego raportu w FS/data/misc/perfetto-traces/bugreport/systrace.pftrace.
Zarówno dane vmstat
, jak i zdarzenia ftrace
można przeglądać do analizy za pomocą interfejsu Perfetto .
dane vmstat
Prześlij plik systrace.pftrace
do interfejsu Perfetto, aby wyświetlić dane vmstat
na wykresie na osi czasu, jak pokazano poniżej.
Rysunek 1. Oś czasu danych graficznych vmstat
śledź wydarzenia
Przechwycone ftrace
mm_events
nie są wyświetlane graficznie na osi czasu. Aby je wyświetlić, kliknij kartę Zapytanie SQL , umieszczoną jak pokazano na rysunku 2.
Rysunek 2. Kliknij Zapytanie (SQL), aby uzyskać dostęp
Włączanie mm_events
Aby włączyć mm_events, ustaw sysprop persist.mm_events.enabled persist.mm_events.enabled=true
od dostawcy init.rc
.
Poniższe rozwiązania mają na celu zmniejszenie zużycia pamięci i procesora przez mm_events:
- Instancja
mm-events ftrace
wykorzystuje bufor o wielkości 4 KB na procesor. - Wyzwalacz
kmem_activity
jest ograniczony do jednego razu na minutę. - W dowolnym momencie może być aktywna tylko sesja śledzenia
mm-events
.
Dostosowywanie
mm_events
używa pliku konfiguracyjnego perfetto
trace, aby określić, które statystyki mają zostać przechwycone podczas sesji śledzenia.
Możesz podać niestandardową konfigurację śledzenia Perfetto w /vendor/etc/mm_events.cfg
. Opis dostępnych pól konfiguracji śledzenia zawiera dokument Perfetto Docs . Przykładową konfigurację śledzenia można znaleźć w tym przykładzie mm_events.cfg
.
Ważne pola, które należy uwzględnić w konfiguracji śledzenia, aby upewnić się, że zostanie wyzwolone przez wykorzystanie pamięci, są pokazane w poniższym fragmencie.
# 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
do końca skonfigurowanego okresu stop_delay_ms
(36000 ms (6 minut). Limit czasu wyzwalacza jest ustawiony na dużą wartość (w tym przypadku 1 godzinę), a mm_events config
jest okresowo odnawiana, aby zapewnić, że mm_events
jest zawsze włączone. W wyniku tego generowany jest raport o błędzie zawierający dane typu pokazanego na Rysunku 1 i Rysunku 2 .