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

Os dispositivos lançados com o Android 12 e versões mais recentes usam 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 e, como é 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 da memória. As estatísticas capturadas estão listadas nas tabelas a seguir.

Campos 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 a 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 mm_events estiver ativado, os relatórios de bugs dos eventos capturados logo após o início de uma alta pressão de memória em um dispositivo vão fornecer as estatísticas históricas de mm_events 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 analisados usando a interface do Perfetto.

Dados do vmstat

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

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

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

Eventos de ftrace

Os ftrace mm_events capturados não são mostrados graficamente na linha do tempo. Para conferir, clique na guia Consultar SQL, localizada conforme mostrado na Figura 2:

Localize a guia "Consultar SQL" e clique para ver ftrace e mm_events capturados e representados em um gráfico.

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

Ativar mm_events

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

As seguintes medidas estão em vigor para reduzir o uso de memória e CPU do mm_events:

  • Uma instância mm-events ftrace usa um buffer de 4 KB por CPU.
  • O gatilho kmem_activity é limitado a 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 capturar durante a sessão de rastreamento.

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

Os campos importantes a serem incluídos na configuração de rastreamento para garantir que ela seja acionada 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 gatilho 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 gatilho é definido como um valor grande (neste caso, 1 hora) e mm_events config é rearmado 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 na Figura 2.