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 de mémoire. mm_events
est intégré aux mécanismes de suivi perfetto
, et comme il n'est activé que lorsqu'une pression mémoire est détectée, sa surcharge de performances supplémentaire est minime. La collecte de statistiques démarre lorsque les kswapd
, direct reclaim,
ou de 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 de la 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 à 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 qui sont capturés peu de temps après qu'un appareil commence à subir une forte pression de mémoire 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
dans l'interface utilisateur de Perfetto 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 ftrace
Les ftrace
mm_events
capturés ne sont pas affichés graphiquement sur la chronologie. Pour les afficher, cliquez sur l'onglet Query SQL , situé comme illustré à 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
à partir 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 CPU. - Le déclencheur
kmem_activity
est limité à une fois par minute. - Seule une session de suivi
mm-events
peut être active à tout moment.
Personnalisation
mm_events
utilise un fichier de configuration de suivi perfetto
pour spécifier les statistiques à capturer pendant la session de suivi.
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 s'assurer qu'elle est déclenchée par la pression de la mémoire sont indiqué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éclencheur est défini sur une valeur élevée (dans ce cas, 1 heure) et la configuration de mm_events config
est périodiquement réarmée pour garantir que mm_events
est toujours activé. Un rapport de bogue est généré en conséquence, contenant le type de données illustré dans la figure 1 et la figure 2 .