Auf Geräten, die mit Android 12 und höher eingeführt werden, wird mm_events verwendet. Das ist eine Reihe von speicherbezogenen Statistiken, die regelmäßig erfasst werden, wenn das System unter Speicherdruck steht. mm_events ist in die perfetto-Tracing-Mechanismen integriert und wird nur aktiviert, wenn eine hohe Arbeitsspeicherauslastung erkannt wird. Der zusätzliche Leistungsaufwand ist daher minimal. Die Erfassung von Statistiken beginnt, wenn die Mechanismen kswapd, direct reclaim, oder compaction des Kernels aktiviert werden. Sie bleibt für einen konfigurierbaren Zeitraum aktiv, um Statistiken in regelmäßigen Abständen zu erfassen.
Anstatt einen einmaligen Snapshot des Systemarbeitsspeicherstatus zu liefern, wenn ein Fehlerbericht eingereicht wird, zeigt mm_events einen kurzen Verlauf der Arbeitsspeicherstatistiken in Zeiten von Arbeitsspeichermangel. 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 für die Ereignisse, die kurz nach dem Auftreten eines hohen Speicherdrucks auf einem Gerät erfasst werden, die bisherigen mm_events-Statistiken in Form eines gezippten Berichts in FS/data/misc/perfetto-traces/bugreport/systrace.pftrace..
Sowohl die vmstat-Daten als auch die ftrace-Ereignisse können in der Perfetto-Benutzeroberfläche zur Analyse aufgerufen werden.
vmstat-Daten
Laden Sie die Datei systrace.pftrace in die Perfetto-Benutzeroberfläche hoch, um die vmstat-Daten in einem Zeitachsendiagramm zu sehen, wie in Abbildung 1 dargestellt:
Abbildung 1: Zeitachse der grafischen vmstat-Daten.
ftrace-Ereignisse
Die erfassten ftrace mm_events werden nicht grafisch auf der Zeitachse dargestellt. Klicken Sie zum Aufrufen der SQL-Abfragen auf den Tab SQL-Abfrage (siehe Abbildung 2):
Abbildung 2: Klicken Sie auf „Abfrage (SQL)“, um darauf zuzugreifen.
mm_events aktivieren
Wenn Sie „mm_events“ aktivieren möchten, legen Sie die System-Property persist.mm_events.enabled=true vom Anbieter init.rc fest.
Folgende Maßnahmen werden ergriffen, um den Arbeitsspeicher- und CPU-Bedarf von „mm_events“ zu minimieren:
- Eine
mm-events ftrace-Instanz verwendet einen 4 KB großen Puffer pro CPU. - Der Trigger
kmem_activityist auf einmal pro Minute begrenzt. - Es kann immer nur eine
mm-events-Aufzeichnungssitzung aktiv sein.
Personalisierung
mm_events verwendet eine perfetto-Konfigurationsdatei, um anzugeben, welche Statistiken während der Tracing-Sitzung erfasst werden sollen.
Sie können eine benutzerdefinierte Perfetto-Trace-Konfiguration in /vendor/etc/mm_events.cfg angeben.
Eine Beschreibung der verfügbaren Felder für die Ablaufverfolgungskonfiguration finden Sie in der Perfetto-Dokumentation.
Ein Beispiel für eine 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 Speicherdruck 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 initiiert mm_events den Perfetto-Trigger kmem_activity. Die Perfetto-Trace-Sitzung beginnt mit der Erfassung von vm_stats- und ftrace-Speicherereignissen bis zum Ende des konfigurierten stop_delay_ms-Zeitraums von 36.000 ms (6 Minuten).
Das Trigger-Zeitlimit ist auf einen großen Wert (in diesem Fall 1 Stunde) festgelegt und mm_events config wird regelmäßig neu aktiviert, damit mm_events immer aktiviert ist. Als Ergebnis wird ein Fehlerbericht generiert, der den in Abbildung 1 und Abbildung 2 gezeigten Datentyp enthält.