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_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 |
mm-bezogene Trace-Ereignisse
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 |
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:
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:
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.