MM-Ereignisse – Historische Gedächtnisstatistik

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.

vmstat data graphed on a timeline

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.

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