Los dispositivos que se lanzan con Android 12 y versiones posteriores usan mm_events
, un conjunto de estadísticas relacionadas con la memoria que se capturan de forma periódica mientras un sistema experimenta presión de memoria. mm_events
está integrado con mecanismos de seguimiento perfetto
y, como solo se activa cuando se detecta presión de memoria, su sobrecarga de rendimiento adicional es mínima. La recopilación de estadísticas comienza cuando se activan los mecanismos kswapd
, direct reclaim,
o compaction
del kernel y permanece activa durante un período configurable para capturar estadísticas a intervalos regulares.
En lugar de proporcionar una instantánea única del estado de la memoria del sistema cuando se envía un informe de errores, mm_events
muestra una breve vista histórica de las estadísticas de la memoria durante períodos de presión de memoria. Las estadísticas obtenidas se enumeran en las siguientes tablas.
Campos de 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 |
Eventos de seguimiento relacionados con 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 |
Cómo analizar los datos de mm_events
Si mm_events
está habilitado, los informes de errores de los eventos que se capturan poco después de que un dispositivo comienza a experimentar una presión de memoria alta proporcionan las estadísticas históricas de mm_events
, en forma de un informe comprimido en FS/data/misc/perfetto-traces/bugreport/systrace.pftrace.
.
Los datos de vmstat
y los eventos ftrace
se pueden ver para su análisis usando la IU de Perfetto.
Datos de vmstat
Sube el archivo systrace.pftrace
a la IU de Perfetto para ver los datos de vmstat
graficados en un cronograma, como se muestra en la Figura 1:
Figura 1: Cronograma de datos gráficos de vmstat.
Eventos de ftrace
El ftrace
mm_events
capturado no se muestra de forma gráfica en el cronograma. Para verlos, haz clic en la pestaña SQL de consulta, ubicada como se muestra en la Figura 2:
Figura 2: Haz clic en Consulta (SQL) para acceder.
Habilitar mm_events
Para habilitar mm_events, establece sysprop persist.mm_events.enabled=true
desde el proveedor init.rc
.
Se implementó lo siguiente para mitigar la huella de memoria y CPU de mm_events:
- Una instancia de
mm-events ftrace
usa un búfer de 4 KB por CPU. - El activador
kmem_activity
tiene un límite de frecuencia de una vez por minuto. - Solo puede haber 1 sesión de registro
mm-events
activa a la vez.
Personalización
mm_events
usa un archivo de configuración de seguimiento perfetto
para especificar qué estadísticas capturar durante la sesión de seguimiento.
Puedes proporcionar una configuración de seguimiento de Perfetto personalizada en /vendor/etc/mm_events.cfg
.
Para obtener una descripción de los campos de configuración de registro disponibles, consulta los Documentos de Perfetto.
Para ver una configuración de registro de muestra, consulta este ejemplo de mm_events.cfg
.
En el fragmento, se muestran los campos importantes que debes incluir en la configuración de seguimiento para asegurarte de que se active por la presión de memoria:
# 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
}
}
En esta configuración, mm_events
inicia el activador kmem_activity
de Perfetto y la sesión de registro de Perfetto comienza a capturar eventos de memoria vm_stats
y ftrace
hasta el final del período stop_delay_ms
configurado, 36,000 ms (6 minutos).
El tiempo de espera del activador se establece en un valor grande (en este caso, 1 hora), y mm_events config
se activa de forma periódica para garantizar que mm_events
siempre esté habilitado. Como resultado, se genera un informe de errores que contiene el tipo de datos que se muestran en la Figura 1 y la Figura 2.