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