Geräte, die mit Android 12 und höher gestartet werden, nutzen mm_events
, eine Reihe speicherbezogener Statistiken, die regelmäßig erfasst werden, während ein System unter Speicherdruck steht. mm_events
ist in perfetto
Tracing-Mechanismen integriert und da es nur aktiviert wird, wenn Speicherdruck erkannt wird, ist sein zusätzlicher Leistungsaufwand minimal. Die Statistikerfassung beginnt, wenn die kswapd
, direct reclaim,
oder compaction
des Kernels aktiviert werden, und bleibt für einen konfigurierbaren Zeitraum aktiv, um in regelmäßigen Abständen Statistiken zu erfassen.
Anstatt einen einmaligen Schnappschuss des Systemspeicherstatus bereitzustellen, wenn ein Fehlerbericht eingereicht wird, zeigt mm_events
eine kurze historische Ansicht der Speicherstatistiken in Zeiten hoher 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 |
Analysieren von mm_events-Daten
Wenn mm_events
aktiviert ist, stellen die Fehlerberichte für die Ereignisse, die erfasst werden, kurz nachdem auf einem Gerät eine hohe Speicherauslastung auftritt, die historischen mm_events
Statistiken in Form eines komprimierten Berichts in FS/data/misc/perfetto-traces/bugreport/systrace.pftrace.
bereit. FS/data/misc/perfetto-traces/bugreport/systrace.pftrace.
Sowohl die vmstat
Daten als auch ftrace
Ereignisse können zur Analyse über die Perfetto-Benutzeroberfläche angezeigt werden.
vmstat-Daten
Laden Sie die Datei systrace.pftrace
auf die Perfetto-Benutzeroberfläche hoch, um die vmstat
Daten wie unten dargestellt auf einer Zeitachse grafisch darzustellen.
Abbildung 1. Zeitleiste der grafischen Daten von vmstat
ftrace-Ereignisse
Die erfassten ftrace
mm_events
werden nicht grafisch auf der Zeitleiste angezeigt. Um sie anzuzeigen, klicken Sie auf die Registerkarte „SQL abfragen“ , die sich wie in Abbildung 2 dargestellt befindet.
Abbildung 2. Klicken Sie auf „Abfrage (SQL)“, um darauf zuzugreifen
Aktivieren von mm_events
Um mm_events zu aktivieren, legen Sie sysprop persist.mm_events.enabled=true
vom Hersteller init.rc
fest.
Folgendes ist vorhanden, um den Speicher- und CPU-Bedarf von mm_events zu verringern:
- Eine
mm-events ftrace
Instanz verwendet einen 4-KB-Puffer pro CPU. - Die Rate des
kmem_activity
Triggers ist auf einmal pro Minute begrenzt. - Es kann jeweils nur 1
mm-events
Trace-Sitzung aktiv sein.
Anpassung
mm_events
verwendet eine perfetto
Trace-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
bereitstellen. Eine Beschreibung der verfügbaren Trace-Konfigurationsfelder 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, um sicherzustellen, dass sie durch Speicherdruck ausgelöst wird, werden im folgenden Snippet angezeigt.
# 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- kmem_activity
Trigger und die Perfetto-Trace-Sitzung beginnt mit der Erfassung von vm_stats
und ftrace
Speicherereignissen bis zum Ende des konfigurierten stop_delay_ms
Zeitraums von 36000 ms (6 Minuten). Das Trigger-Timeout ist auf einen großen Wert eingestellt (in diesem Fall 1 Stunde) und mm_events config
wird regelmäßig neu aktiviert, um sicherzustellen, dass mm_events
immer aktiviert ist. Als Ergebnis wird ein Fehlerbericht generiert, der die in Abbildung 1 und Abbildung 2 dargestellten Datentypen enthält.