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

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

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

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

Analisar dados de mm_events

Se o mm_events estiver ativado, os relatórios de bugs dos eventos capturados logo após o início da alta pressão de memória em um dispositivo vão fornecer as estatísticas mm_events históricas, na forma de um relatório compactado em FS/data/misc/perfetto-traces/bugreport/systrace.pftrace..

Os dados vmstat e os eventos ftrace podem ser visualizados para análise usando a interface do Perfetto.

Dados de vmstat

Faça upload do arquivo systrace.pftrace para a interface do Perfetto e confira os dados de vmstat representados em um cronograma, conforme mostrado na Figura 1:

Dados do vmstat representados em um gráfico em uma linha do tempo

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á-las, clique na guia Query SQL, localizada conforme mostrado na Figura 2:

Localize a guia "Consulta SQL" e clique para conferir o ftrace e o mm_events capturados e representados em gráfico.

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

Ativar mm_events

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

As seguintes medidas foram implementadas para reduzir o impacto na memória e na CPU do mm_events:

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

Personalização

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

É possível fornecer uma configuração de trace personalizada do Perfetto em /vendor/etc/mm_events.cfg. Para uma descrição dos campos de configuração de rastreamento disponíveis, consulte os documentos do Perfetto. Para conferir um exemplo de configuração de rastreamento, consulte este exemplo de mm_events.cfg.

Os campos importantes a serem incluídos na configuração de rastreamento para garantir que ele seja acionado pela pressão de 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
  }
}

Nessa configuração, mm_events inicia o acionador kmem_activity do perfetto e a sessão de rastreamento do 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 acionador é definido como um valor alto (neste caso, 1 hora), e mm_events config é reinicializado periodicamente para garantir que mm_events esteja sempre ativado. Como resultado, um relatório de bug é gerado, contendo o tipo de dados mostrado na Figura 1 e na Figura 2.