MM-Ereignisse – Verlaufsstatistiken des Arbeitsspeichers

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 perfetto-Tracing-Mechanismen eingebunden. Da es nur aktiviert wird, wenn Speicherauslastung 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 zu liefern, wenn ein Fehlerbericht erstellt wird, zeigt mm_events eine kurze Übersicht über den Verlauf der Arbeitsspeicherstatistiken während eines Zeitraums von Speicherauslastung. 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 dem 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 zu sehen, wie in Abbildung 1 dargestellt:

vmstat-Daten auf einer Zeitachse grafisch dargestellt

Abbildung 1. Zeitachse der grafischen Daten von vmstat

ftrace-Ereignisse

Die erfassten ftrace mm_events werden nicht grafisch auf der Zeitachse dargestellt. Um sie anzuzeigen, klicken Sie auf den Tab Abfrage-SQL, wie in Abbildung 2 dargestellt:

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 Anbieterinit.rc fest.

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

  • Eine mm-events ftrace-Instanz verwendet einen Zwischenspeicher von 4 KB pro CPU.
  • Der Trigger kmem_activity 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. Ein Beispiel für eine Trace-Konfiguration finden Sie in diesem mm_events.cfg-Beispiel.

Im Snippet sehen Sie die wichtigen Felder, die Sie in Ihre Trace-Konfiguration aufnehmen müssen, damit sie durch die Speicherauslastung ausgelöst wird:

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