Estatísticas de memória histórica de eventos MM

Os dispositivos lançados no Android 12 e versões posteriores utilizam mm_events , um conjunto de estatísticas relacionadas à memória que são capturadas periodicamente enquanto um sistema sofre pressão de memória. mm_events é integrado a mecanismos de rastreamento perfetto e, como é ativado somente quando a pressão da memória é detectada, sua sobrecarga de desempenho adicional é mínima. A coleta de estatísticas começa quando os mecanismos kswapd , direct reclaim, ou compaction do kernel são ativados e permanece ativo por um período de tempo configurável para capturar estatísticas em intervalos regulares.

Em vez de fornecer um instantâneo único do estado da memória do sistema quando um relatório de bug é arquivado, mm_events mostra uma breve visão histórica das estatísticas da memória durante períodos de pressão de memória. As estatísticas capturadas estão listadas nas tabelas a seguir.

campos 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 rastreamento relacionados ao 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

Analisar dados mm_events

Se mm_events estiver habilitado, os relatórios de bugs para os eventos que são capturados logo após um dispositivo começar a sofrer alta pressão de memória fornecem as estatísticas históricas mm_events , na forma de um relatório compactado em FS/data/misc/perfetto-traces/bugreport/systrace.pftrace.

Tanto os dados vmstat quanto os eventos ftrace podem ser visualizados para análise usando a UI do Perfetto .

dados vmstat

Carregue o arquivo systrace.pftrace na UI do Perfetto para ver os dados vmstat representados graficamente em uma linha do tempo, conforme mostrado na Figura 1:

vmstat data graphed on a timeline

Figura 1. Linha do tempo dos dados gráficos do vmstat.

eventos ftrace

Os ftrace mm_events capturados não são mostrados graficamente na linha do tempo. Para visualizá-los, clique na aba Consultar SQL , localizada conforme mostrado na Figura 2:

Locate the Query SQL tab and click to view ftrace and mm_events captured and graphed

Figura 2. Clique em Consulta (SQL) para acessar.

Habilitar mm_events

Para ativar mm_events, defina sysprop persist.mm_events.enabled=true do fornecedor init.rc .

O seguinte está em vigor para mitigar o consumo de memória e CPU de mm_events:

  • Uma instância mm-events ftrace usa um buffer de 4 KB por CPU.
  • O gatilho kmem_activity tem taxa limitada a uma vez por minuto.
  • Apenas uma sessão de rastreamento mm-events pode estar ativa a qualquer momento.

Costumização

mm_events usa um arquivo de configuração de rastreamento perfetto para especificar quais estatísticas capturar durante a sessão de rastreamento.

Você pode fornecer uma configuração de rastreamento Perfetto personalizada em /vendor/etc/mm_events.cfg . Para obter uma descrição dos campos de configuração de rastreamento disponíveis, consulte Perfetto Docs . Para obter uma configuração de rastreio de amostra, consulte este exemplo mm_events.cfg .

Os campos importantes a serem incluídos na configuração do trace para garantir que ele seja acionado pela pressão da memória são mostrados no snippet:

# 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
  }
}

Nesta configuração, mm_events inicia o gatilho perfetto kmem_activity e a sessão de rastreamento Perfetto começa a capturar eventos de memória vm_stats e ftrace até o final do período stop_delay_ms configurado, 36.000 ms (6 minutos). O tempo limite do trigger é definido para um valor grande (neste caso, 1 hora) e mm_events config é rearmada periodicamente para garantir que mm_events esteja sempre habilitado. Como resultado, um relatório de bug é gerado, contendo o tipo de dados mostrado na Figura 1 e na Figura 2 .