Statistiques sur la mémoire historique des événements MM

Les appareils qui se lancent sur Android 12 ou version ultérieure utilisent mm_events, un ensemble de statistiques liées à la mémoire qui sont capturées périodiquement lorsqu'un système subit une saturation de la mémoire. mm_events est intégré aux mécanismes de traçage perfetto. Étant donné qu'il n'est activé que lorsque la pression de la mémoire est détectée, son impact sur les performances est minimal. La collecte de statistiques commence lorsque les mécanismes kswapd, direct reclaim, ou compaction du noyau sont activés. Elle reste active pendant une période configurable afin de capturer des statistiques à intervalles réguliers.

Au lieu de fournir un instantané unique de l'état de la mémoire système lorsqu'un rapport de bug est créé, mm_events affiche un bref historique des statistiques de mémoire pendant les périodes de pression sur la mémoire. Les statistiques capturées sont listées dans les tableaux suivants.

Champs vmstat

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

Événements de trace associés à mm

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

Analyser les données mm_events

Si mm_events est activé, les rapports de bugs pour les événements capturés peu de temps après qu'un appareil commence à subir une pression de mémoire élevée fournissent les statistiques mm_events historiques, sous la forme d'un rapport compressé dans FS/data/misc/perfetto-traces/bugreport/systrace.pftrace..

Les données vmstat et les événements ftrace peuvent être consultés à des fins d'analyse à l'aide de l'interface utilisateur de Perfetto.

Données vmstat

Importez le fichier systrace.pftrace dans l'UI de Perfetto pour afficher les données vmstat sur une chronologie, comme illustré dans la figure 1:

Données vmstat représentées sur un graphique temporel

Figure 1 : Chronologie des données graphiques vmstat.

Événements ftrace

Les ftrace mm_events capturés ne sont pas représentés graphiquement dans la chronologie. Pour les afficher, cliquez sur l'onglet Query SQL (Requête SQL), comme illustré dans la figure 2:

Recherchez l'onglet "Requête SQL", puis cliquez dessus pour afficher les traces ftrace et mm_events capturées et représentées sous forme de graphiques.

Figure 2. Cliquez sur "Requête (SQL)" pour y accéder.

Activer mm_events

Pour activer mm_events, définissez le paramètre sysprop persist.mm_events.enabled=true du fournisseur init.rc.

Les mesures suivantes sont mises en place pour réduire l'empreinte mémoire et de processeur de mm_events:

  • Une instance mm-events ftrace utilise un tampon de 4 Ko par processeur.
  • Le déclencheur kmem_activity est limité à une fois par minute.
  • Seule 1 session de trace mm-events peut être active à la fois.

Personnalisation

mm_events utilise un fichier de configuration de trace perfetto pour spécifier les statistiques à capturer pendant la session de traçage.

Vous pouvez fournir une configuration de trace Perfetto personnalisée dans /vendor/etc/mm_events.cfg. Pour obtenir une description des champs de configuration de trace disponibles, consultez la documentation de Perfetto. Pour obtenir un exemple de configuration de trace, consultez cet exemple de mm_events.cfg.

Les champs importants à inclure dans votre configuration de trace pour vous assurer qu'elle est déclenchée par la pression de mémoire sont indiqués dans l'extrait suivant:

# 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
  }
}

Dans cette configuration, mm_events lance le déclencheur kmem_activity de Perfetto, et la session de trace Perfetto commence à capturer les événements de mémoire vm_stats et ftrace jusqu'à la fin de la période stop_delay_ms configurée, soit 36 000 ms (6 minutes). Le délai avant expiration du déclencheur est défini sur une valeur élevée (dans ce cas, une heure) et mm_events config est réarmé périodiquement pour s'assurer que mm_events est toujours activé. Un rapport de bug est généré, contenant le type de données illustré dans les figures 1 et 2.