Estadísticas de memoria históricas 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 de perfetto y, como se activa solo cuando se detecta presión de memoria, su sobrecarga de rendimiento agregada 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 presenta un informe de errores, mm_events muestra una breve vista histórica de las estadísticas de memoria durante los períodos de presión de memoria. Las estadísticas capturadas 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

Analiza 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 alta presión de memoria 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 de ftrace se pueden ver para su análisis con 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 una línea de tiempo, como se muestra en la Figura 1:

Datos de vmstat representados en un gráfico de cronograma

Figura 1: Línea de tiempo de los datos gráficos de vmstat

Eventos de ftrace

Los mm_events de ftrace capturados no se muestran gráficamente en la línea de tiempo. Para verlos, haz clic en la pestaña Query SQL, ubicada como se muestra en la Figura 2:

Ubica la pestaña Query SQL y haz clic para ver los eventos de ftrace y mm_events capturados y representados en un gráfico.

Figura 2: Haz clic en Query (SQL) para acceder.

Habilita mm_events

Para habilitar mm_events, establece sysprop persist.mm_events.enabled=true desde el proveedor init.rc.

Se implementaron las siguientes medidas para mitigar el uso 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 una limitación de frecuencia de una vez por minuto.
  • Solo puede haber 1 sesión de seguimiento de mm-events activa en cualquier momento.

Personalización

mm_events usa un archivo de configuración de seguimiento de 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 seguimiento disponibles, consulta la documentación de Perfetto. Para obtener una configuración de seguimiento de muestra, consulta este mm_events.cfg ejemplo.

Los campos importantes que se deben incluir en la configuración de seguimiento para garantizar que se active por la presión de memoria se muestran en el fragmento:

# 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 seguimiento 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 vuelve a armar 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 muestra en la Figura 1 y la Figura 2.