Statystyki pamięci historycznej zdarzeń MM

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_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 logu czasu 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

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.

Dane vmstat przedstawione na wykresie na osi czasu

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:

Odszukaj kartę Zapytanie SQL i kliknij, aby wyświetlić zarejestrowane i wykresowane wartości ftrace i mm_events.

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.cfgprzykł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_statsftrace 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. 1rys. 2.