Statystyki pamięci historycznej zdarzeń MM

Urządzenia z Androidem 12 lub nowszym korzystają z mm_events, czyli zestawu statystyk związanych z pamięcią, które są okresowo rejestrowane, gdy system jest poddany obciążeniu pamięci. mm_events jest zintegrowany z mechanizmami śledzenia perfetto i jest aktywowany tylko wtedy, gdy wykryty zostanie brak pamięci, więc dodatkowy narzut na wydajność jest minimalny. Zbieranie statystyk rozpoczyna się, gdy aktywują się mechanizmy jądra kswapd, direct reclaim, lub compaction, i pozostaje aktywne przez konfigurowalny okres, aby rejestrować statystyki w regularnych odstępach czasu.

Zamiast jednorazowego zrzutu stanu pamięci systemu w momencie zgłoszenia błędu mm_events wyświetla krótki widok historyczny statystyk pamięci w okresach jej dużego obciążenia. Zebrane statystyki są wymienione w tabelach poniżej.

Pola vmstat

nr_free_pagesnr_slab_reclaimable
nr_slab_unreclaimablenr_active_file
nr_inactive_filenr_active_anon
nr_inactive_anonworkingset_refault
workingset_activatenr_file_pages
pgpginpgpgout
pswpinpswpout
pgsteal_kswapd_dmapgsteal_kswapd_normal
pgsteal_kswapd_movablepgsteal_direct_dma
pgsteal_direct_normalpgsteal_direct_movable
pgscan_kswapd_dmapgscan_kswapd_normal
pgscan_kswapd_movablepgscan_direct_dma
pgscan_direct_normalpgscan_direct_movable
compact_migrate_scannedcompact_free_scanned

zdarzenia śledzenia związane z mm,

vmscan/mm_vmscan_kswapd_wakevmscan/mm_vmscan_kswapd_sleep
vmscan/mm_vmscan_direct_reclaim_beginvmscan/mm_vmscan_direct_reclaim_end
compaction/mm_compaction_begincompaction/mm_compaction_end

Analizowanie danych mm_events

Jeśli funkcja mm_events jest włączona, raporty o błędach dotyczące zdarzeń zarejestrowanych wkrótce po tym, jak urządzenie zacznie wykazywać wysokie obciążenie pamięci, zawierają dane historyczne 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 wyświetlać w celu analizy za pomocą interfejsu Perfetto.

dane vmstat

Prześlij plik systrace.pftrace do interfejsu Perfetto, aby zobaczyć dane vmstat przedstawione na wykresie na osi czasu, jak pokazano na rysunku 1:

Dane vmstat przedstawione na wykresie na osi czasu

Rysunek 1. Oś czasu danych graficznych vmstat.

zdarzenia ftrace,

Zarejestrowane 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:

Znajdź kartę Zapytanie SQL i kliknij ją, aby wyświetlić przechwycone i wykresy ftrace i mm_events.

Rysunek 2. Aby uzyskać dostęp, kliknij Zapytanie (SQL).

Włączanie mm_events

Aby włączyć mm_events, ustaw sysprop persist.mm_events.enabled=true z vendor init.rc.

.

Aby zmniejszyć wykorzystanie pamięci i procesora przez mm_events, zastosowano te rozwiązania:

  • Instancja mm-events ftrace używa bufora 4 KB na procesor.
  • Wywołanie kmem_activity jest ograniczone do 1 razu na minutę.
  • W danym momencie może być aktywna tylko 1 sesja śledzenia mm-events.

Dostosowywanie

mm_events używa pliku konfiguracji śledzenia perfetto, aby określić, które statystyki mają być rejestrowane podczas sesji śledzenia.

/vendor/etc/mm_events.cfg możesz podać niestandardową konfigurację śledzenia Perfetto. Opis dostępnych pól konfiguracji śledzenia znajdziesz w dokumentacji Perfetto. Przykładową konfigurację śledzenia znajdziesz w tym mm_events.cfg przykładzie.

Ważne pola, które należy uwzględnić w konfiguracji śledzenia, aby zapewnić jej wywoływanie przez obciążenie pamięci, są widoczne we fragmencie kodu:

# 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 kmem_activity Perfetto, a sesja śledzenia Perfetto rozpoczyna rejestrowanie zdarzeń vm_statsftrace dotyczących pamięci do końca skonfigurowanego okresu stop_delay_ms, czyli 36000 ms (6 minut). Limit czasu wyzwalacza jest ustawiony na dużą wartość (w tym przypadku 1 godzinę), a mm_events config jest okresowo ponownie uzbrajany, aby zapewnić, że mm_events jest zawsze włączony. W wyniku tego zostanie wygenerowany raport o błędzie, który będzie zawierać typ danych widoczny na rysunku 1rysunku 2.