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 pression de 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 des statistiques commence lorsque les mécanismes kswapd
, direct reclaim,
ou compaction
du noyau sont activés, et 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 créé, mm_events
affiche un bref historique des statistiques de mémoire pendant les périodes de pression sur la mémoire. Les statistiques collecté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 à 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
sous forme de graphique 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. - Une seule session de traçage
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 la 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 traçage 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.