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_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 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:
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:
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.