MM-Ereignisse – Statistiken zum Arbeitsspeicher in der Vergangenheit

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_pagesnr_slab_reclaimable
nr_slab_unreclaimablenr_active_file
nr_inactive_filenr_active_anon
nr_inactive_anonworkingset_refault
workingset_activatenr_file_pages
pgpginpgpgout
pswpinpswpout
pgsteal_kswapd_dmapgsteal_kswapd_normal
pgsteal_kswapd_movablepgsteal_direct_dma
pgsteal_direct_normalpgsteal_direct_movable
pgscan_kswapd_dmapgscan_kswapd_normal
pgscan_kswapd_movablepgscan_direct_dma
pgscan_direct_normalpgscan_direct_movable
compact_migrate_scannedcompact_free_scanned

mm-bezogene Trace-Ereignisse

vmscan/mm_vmscan_kswapd_wakevmscan/mm_vmscan_kswapd_sleep
vmscan/mm_vmscan_direct_reclaim_beginvmscan/mm_vmscan_direct_reclaim_end
compaction/mm_compaction_begincompaction/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:

vmstat-Daten in einem Zeitachsendiagramm

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):

Suchen Sie den Tab „SQL-Abfrage“ und klicken Sie darauf, um die erfassten und grafisch dargestellten ftrace- und mm_events-Daten anzusehen.

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_activity ist 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.