Statystyki pamięci historycznej zdarzeń MM

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:

vmstat data graphed on a timeline

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:

Locate the Query SQL tab and click to view ftrace and mm_events captured and graphed

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 .