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_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 |
Événements de trace associés à mm
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 |
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:
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:
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.