MM-Ereignisse - Historische Speicherstatistik

Geräte, die auf Android 12 und höher gestartet werden, verwenden mm_events , eine Reihe von speicherbezogenen Statistiken, die regelmäßig erfasst werden, während ein System Speicherdruck erfährt. mm_events ist in perfetto -Ablaufverfolgungsmechanismen integriert, und da es nur aktiviert wird, wenn Speicherdruck erkannt wird, ist sein zusätzlicher Leistungsaufwand minimal. Die Statistikerfassung beginnt, wenn der compaction des Kernels, direct reclaim, - kswapd oder Komprimierungsmechanismen 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 während Zeiten mit Speicherdruck. 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 Ablaufverfolgungsereignisse

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 Speicherbelastung auftritt, die historischen 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 mithilfe der Perfetto-Benutzeroberfläche zur Analyse angezeigt werden.

vmstat-Daten

Laden Sie die Datei systrace.pftrace auf die Perfetto-Benutzeroberfläche hoch, um die vmstat -Daten anzuzeigen, die wie unten gezeigt auf einer Zeitachse dargestellt werden.

vmstat data graphed on a timeline

Abbildung 1. Zeitachse der grafischen vmstat-Daten

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 gezeigt befindet.

Locate the Query SQL tab and click to view ftrace and mm_events captured and graphed

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

Aktivieren von mm_events

Um mm_events zu aktivieren, setzen Sie sysprop persist.mm_events.enabled=true aus der init.rc des Anbieters.

Folgendes ist vorhanden, um den Speicher- und CPU-Fußabdruck von mm_events zu verringern:

  • Eine mm-events ftrace Instanz verwendet einen 4-KB-Puffer pro CPU.
  • Der Auslöser kmem_activity ist auf einmal pro Minute begrenzt.
  • Es kann immer nur eine 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 . Eine Beschreibung der verfügbaren Trace-Konfigurationsfelder finden Sie in der Perfetto-Dokumentation . 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, sind im folgenden Snippet dargestellt.

# 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 Trigger perfetto kmem_activity und die Perfetto-Trace-Sitzung beginnt mit der Erfassung von vm_stats und ftrace Speicherereignissen bis zum Ende des konfigurierten Zeitraums stop_delay_ms , 36000 ms (6 Minuten). Das Trigger-Timeout wird auf einen hohen Wert gesetzt (in diesem Fall 1 Stunde) und mm_events config wird regelmäßig neu eingerichtet, um sicherzustellen, dass mm_events immer aktiviert ist. Als Ergebnis wird ein Fehlerbericht generiert, der die in Abbildung 1 und Abbildung 2 gezeigten Datentypen enthält.