Les appareils qui se lancent 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 subit une pression sur la mémoire. mm_events
est intégré aux mécanismes de traçage perfetto
, et comme il n'est activé que lorsqu'une pression de mémoire est détectée, sa surcharge de performances supplémentaire est minime. La collecte de statistiques démarre lorsque les mécanismes kswapd
, direct reclaim,
ou compaction
du noyau sont activés, et elle reste active pendant une période de temps 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 bogue est déposé, mm_events
affiche une brève vue historique des statistiques de la mémoire pendant les périodes de pression mémoire. Les statistiques capturées sont répertorié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 aux 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 |
Analyse des données mm_events
Si mm_events
est activé, les rapports de bogues 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 historiques mm_events
, 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 visualisés pour analyse à l'aide de l' interface utilisateur Perfetto .
données vmstat
Téléchargez le fichier systrace.pftrace
sur Perfetto UI pour voir les données vmstat
représentées graphiquement sur une chronologie, comme indiqué ci-dessous.
Figure 1. Chronologie des données graphiques vmstat
événements de course
Les ftrace
mm_events
capturés ne sont pas affichés graphiquement sur la chronologie. Pour les afficher, cliquez sur l'onglet Requête SQL , situé comme indiqué dans la figure 2.
Figure 2. Cliquez sur Requête (SQL) pour accéder
Activation de mm_events
Pour activer mm_events, définissez sysprop persist.mm_events.enabled=true
auprès du fournisseur init.rc
.
Les éléments suivants sont en place pour atténuer l'empreinte mémoire et CPU 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 une session de trace
mm-events
peut être active à tout moment.
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 une description des champs de configuration de trace disponibles, consultez la documentation Perfetto . Pour un exemple de configuration de trace, consultez cet exemple mm_events.cfg
.
Les champs importants à inclure dans votre configuration de trace pour garantir qu'elle soit déclenchée par la pression de la mémoire sont affichés dans l'extrait ci-dessous.
# 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 perfetto kmem_activity
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, 36 000 ms (6 minutes). Le délai d'expiration du déclenchement est défini sur une valeur élevée (dans ce cas, 1 heure) et mm_events config
est périodiquement réarmée pour garantir que mm_events
est toujours activé. En conséquence, un rapport de bogue est généré, contenant le type de données présenté dans la Figure 1 et la Figure 2 .