Les appareils lancés sur Android 12 et versions ultérieures utilisent mm_events, un ensemble de statistiques liées à la mémoire qui sont capturées périodiquement lorsqu'un système est soumis à une pression sur la mémoire. mm_events est intégré aux mécanismes de traçage perfetto. Comme il n'est activé que lorsqu'une pression sur la mémoire est détectée, sa surcharge de performances ajoutée est minimale. 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
pour 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 déposé, 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 liés à la mémoire
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 bug pour les événements capturés peu de temps après qu'un appareil commence à subir une forte pression sur la mémoire 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 affichés pour analyse à l'aide de l'
UI Perfetto.
Données vmstat
Importez le fichier systrace.pftrace dans l'UI Perfetto pour afficher les données vmstat représentées graphiquement sur une chronologie, comme illustré dans la figure 1 :
Figure 1. Chronologie des données graphiques vmstat.
Événements ftrace
Les mm_events ftrace capturés ne sont pas affichés graphiquement sur la chronologie. Pour les afficher, cliquez sur l'onglet Query SQL (Requête SQL), comme illustré dans la figure 2 :
Figure 2. Cliquez sur Query (SQL) (Requête SQL) pour accéder.
Activer mm_events
Pour activer mm_events, définissez la propriété système persist.mm_events.enabled=true à partir du fournisseur init.rc.
Les éléments suivants sont en place pour atténuer l'empreinte mémoire et processeur de mm_events :
- Une instance
mm-events ftraceutilise un tampon de 4 Ko par processeur. - Le déclencheur
kmem_activityest limité à une fois par minute. - Une seule session de trace
mm-eventspeut ê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
Perfetto.
Pour obtenir un exemple de configuration de trace, consultez cet
mm_events.cfg
exemple.
Les champs importants à inclure dans votre configuration de trace pour vous assurer qu'elle est déclenchée par la pression sur la mémoire sont affichés dans l'extrait de code :
# 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 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 d'inactivité du déclencheur est défini sur une valeur élevée (dans ce cas, 1 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 affiché dans la figure 1
et la figure 2.