Eventos MM - Estatísticas de Memória Histórica

Os dispositivos iniciados no Android 12 e superior 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 apenas quando a pressão da memória é detectada, sua sobrecarga de desempenho adicional é mínima. A coleta de estatísticas começa quando os 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 os períodos de pressão da 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 a 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

Analisando dados mm_events

Se mm_events estiver ativado, os relatórios de bugs para os eventos que são capturados logo após um dispositivo começar a experimentar 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 interface do usuário do Perfetto .

dados vmstat

Carregue o arquivo systrace.pftrace para a interface do usuário do Perfetto para ver os dados vmstat representados graficamente em uma linha do tempo, conforme mostrado abaixo.

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 guia Query 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

Ativando mm_events

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

O seguinte está em vigor para mitigar a memória e o espaço ocupado pela CPU de mm_events:

  • Uma instância mm-events ftrace usa um buffer de 4 KB por CPU.
  • O gatilho kmem_activity é limitado a uma taxa por minuto.
  • Apenas a 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 o Perfetto Docs . Para obter uma configuração de rastreamento de amostra, consulte este exemplo mm_events.cfg .

Os campos importantes a serem incluídos em sua configuração de rastreamento para garantir que ela seja acionada pela pressão da memória são mostrados no snippet abaixo.

# 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 trigger perfetto kmem_activity e a sessão Perfetto trace começa a capturar eventos de memória vm_stats e ftrace até o final do período stop_delay_ms configurado, 36000 ms (6 minutos). O tempo limite do acionador é definido para um valor grande (neste caso, 1 hora) e mm_events config é rearmada periodicamente para garantir que mm_events esteja sempre ativado. Um relatório de bug é gerado como resultado, contendo o tipo de dados mostrado na Figura 1 e Figura 2 .