Estadísticas de la memoria histórica de eventos de MM

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_pagesnr_slab_reclaimable
nr_slab_unreclaimablenr_active_file
nr_inactive_filenr_active_anon
nr_inactive_anonworkingset_refault
workingset_activatenr_file_pages
pgpginpgpgout
pswpinpswpout
pgsteal_kswapd_dmapgsteal_kswapd_normal
pgsteal_kswapd_movablepgsteal_direct_dma
pgsteal_direct_normalpgsteal_direct_movable
pgscan_kswapd_dmapgscan_kswapd_normal
pgscan_kswapd_movablepgscan_direct_dma
pgscan_direct_normalpgscan_direct_movable
compact_migrate_scannedcompact_free_scanned

Eventos de seguimiento relacionados con mm

vmscan/mm_vmscan_kswapd_wakevmscan/mm_vmscan_kswapd_sleep
vmscan/mm_vmscan_direct_reclaim_beginvmscan/mm_vmscan_direct_reclaim_end
compaction/mm_compaction_begincompaction/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:

Datos de vmstat graficados en un cronograma

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:

Busca la pestaña Consulta en SQL y haz clic para ver ftrace y mm_events capturados y graficados.

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.