MM-Ereignisse – Statistiken zum Arbeitsspeicher in der Vergangenheit

Auf Geräten mit Android 12 und höher wird mm_events verwendet. Dabei handelt es sich um eine Reihe von speicherbezogenen Statistiken, die regelmäßig erfasst werden, wenn ein System unter Speicherdruck steht. mm_events ist in die perfetto-Tracing-Mechanismen integriert. Da es nur aktiviert wird, wenn ein Arbeitsspeicherengpass erkannt wird, ist der zusätzliche Leistungsaufwand minimal. Die Statistikerhebung beginnt, wenn die kswapd-, direct reclaim,- oder compaction-Mechanismen des Kernels aktiviert werden. Sie bleibt für einen konfigurierbaren Zeitraum aktiv, um Statistiken in regelmäßigen Intervallen zu erfassen.

Anstatt einen einmaligen Snapshot des Systemspeicherstatus bei Einreichen eines Fehlerberichts bereitzustellen, zeigt mm_events eine kurze Verlaufsansicht der Speicherstatistiken während Zeiten mit Speichermangel an. Die erfassten Statistiken sind in den folgenden Tabellen aufgeführt.

vmstat-Felder

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

mm-bezogene Trace-Ereignisse

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

mm_events-Daten analysieren

Wenn mm_events aktiviert ist, enthalten die Fehlerberichte zu den Ereignissen, die kurz nach Beginn eines hohen Arbeitsspeicherdrucks auf einem Gerät erfasst werden, die bisherigen mm_events-Statistiken in Form eines komprimierten Berichts in FS/data/misc/perfetto-traces/bugreport/systrace.pftrace..

Sowohl vmstat-Daten als auch ftrace-Ereignisse können über die Perfetto-Benutzeroberfläche zur Analyse aufgerufen werden.

vmstat-Daten

Laden Sie die systrace.pftrace-Datei in die Perfetto-Benutzeroberfläche hoch, um die vmstat-Daten in einer Zeitachse wie in Abbildung 1 dargestellt zu sehen:

vmstat-Daten in einem Zeitdiagramm

Abbildung 1: Zeitachse der grafischen Daten von vmstat

ftrace-Ereignisse

Die erfassten ftrace mm_events werden nicht grafisch in der Zeitachse dargestellt. Klicken Sie dazu auf den Tab SQL-Abfrage (siehe Abbildung 2):

Klicken Sie auf den Tab „SQL-Abfrage“, um aufgezeichnete und in Diagrammen dargestellte ftrace- und mm_events aufzurufen.

Abbildung 2: Klicken Sie auf „Abfrage (SQL)“, um darauf zuzugreifen.

mm_events aktivieren

Wenn Sie mm_events aktivieren möchten, legen Sie das Sysprop persist.mm_events.enabled=true von Anbieter init.rc fest.

Die folgenden Maßnahmen sollen den Arbeitsspeicher- und CPU-Footprint von mm_events reduzieren:

  • Eine mm-events ftrace-Instanz verwendet einen 4-KB-Puffer pro CPU.
  • Der kmem_activity-Trigger ist auf einmal pro Minute begrenzt.
  • Es kann immer nur eine mm-events-Sitzung aktiv sein.

Personalisierung

mm_events verwendet eine perfetto-Trace-Konfigurationsdatei, um anzugeben, welche Statistiken während der Trace-Sitzung erfasst werden sollen.

Sie können in /vendor/etc/mm_events.cfg eine benutzerdefinierte Perfetto-Trace-Konfiguration angeben. Eine Beschreibung der verfügbaren Felder für die Trace-Konfiguration finden Sie in den Perfetto-Dokumenten. Eine Beispiel-Trace-Konfiguration finden Sie in diesem mm_events.cfg-Beispiel.

Die wichtigen Felder, die Sie in Ihre Trace-Konfiguration aufnehmen müssen, damit sie durch Speichermangel ausgelöst wird, sind im Snippet zu sehen:

# 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
  }
}

In dieser Konfiguration löst mm_events den perfetto-kmem_activity-Trigger aus und die Perfetto-Trace-Sitzung beginnt, vm_stats- und ftrace-Speicherereignisse bis zum Ende des konfigurierten stop_delay_ms-Zeitraums (36.000 ms, 6 Minuten) zu erfassen. Die Zeitüberschreitung für den Trigger ist auf einen hohen Wert (in diesem Fall 1 Stunde) festgelegt und mm_events config wird regelmäßig neu gestartet, damit mm_events immer aktiviert ist. Daraufhin wird ein Fehlerbericht generiert, der die in Abbildung 1 und Abbildung 2 gezeigten Daten enthält.